Kwargs的嵌入式参数

问题描述 投票:1回答:2

有没有办法嵌入参数,并将kwargs传递给函数?

例如:

机器人文件

Testcase1
    do something "value" extra_args=bla

Python库

@keyword('do something "${value}"')
def do_something(self, value, **kwargs):
    print(value)
    print(kwargs)

虽然上述方法不起作用。我也试过了

Testcase1
    do something "value"    extra_args=bla

*** Variables ***
    &{DICT}        extra_args=bla

Testcase1
    do something "value"    &{DICT}

还有很多其他组合。我在Robotframework中发现了添加此限制的拉取请求,但我确信其他图书馆编写者必须要这个功能。

谢谢

python-3.x robotframework
2个回答
1
投票

简短的回答 - 不,这是不允许的; doc link, the last paragraph in Basic Syntax

考虑到这一点,我可以看到这种限制来自何处 - 如果在带有嵌入参数的关键字中支持kwargs,解析器将会非常困难,主要是在两个方面:

  • 在哪里将参数分解为单独的变量?

在此示例代码中:

My keyword @{kwarg} varies
    Pass Execution

,当这样调用时:

My keyword was called varies

,论证应该是什么 - 一个有价值was called,或两个 - wascalled

  • 匹配目标关键字

另一个示例关键字定义

My keyword @{kwarg}
    Pass Execution

My keyword ${normal} argument
    Pass Execution

,当这样调用时:

My keyword one argument

,解析器匹配哪两个关键字?

正如您所看到的,嵌入式语法中的kwargs会导致问题,这可能只是冰山一角。


旁注 - 尽管我个人发现嵌入式参数的关键词很酷 - 你可以打电话看起来像普通英语!几乎没有其他语言能给你这种可能性!通过练习我发现它们有限制,现在尽量避免它们。 有两个原因 - 您将来无法更改此类关键字的签名,例如添加可选参数(或kwargs;))。第二个是参数总是作为字符串对象传递 - 所以如果它处理另一个类型,你必须将它们转换为关键字,而忘记传递复杂的对象类型。


0
投票

在Robot Framework文档中,这将在Free keyword arguments (**kwargs)一节中介绍。

Robot Framework 2.8使用Python的** kwargs语法添加了对免费关键字参数的支持。如何在测试数据中使用语法在“创建测试用例”下的“自由关键字参数”部分中进行了讨论。在本节中,我们将了解如何在自定义测试库中实际使用它。

这是Python示例:

def various_args(arg, *varargs, **kwargs):
    print 'arg:', arg
    for value in varargs:
        print 'vararg:', value
    for name, value in sorted(kwargs.items()):
        print 'kwarg:', name, value

和相应的机器人文件:

*** Test Cases ***
Positional
    Various Args    hello    world                # Logs 'arg: hello' and 'vararg: world'.

Named
    Various Args    arg=value                     # Logs 'arg: value'.

Kwargs
    Various Args    a=1    b=2    c=3             # Logs 'kwarg: a 1', 'kwarg: b 2' and 'kwarg: c 3'.
    Various Args    c=3    a=1    b=2             # Same as above. Order does not matter.

Positional and kwargs
    Various Args    1    2    kw=3                # Logs 'arg: 1', 'vararg: 2' and 'kwarg: kw 3'.

Named and kwargs
    Various Args    arg=value      hello=world    # Logs 'arg: value' and 'kwarg: hello world'.
    Various Args    hello=world    arg=value      # Same as above. Order does not matter.
© www.soinside.com 2019 - 2024. All rights reserved.