Python 机器人框架:在kwargs中循环

Python 机器人框架:在kwargs中循环,python,robotframework,Python,Robotframework,我需要在robot中获取一个关键字参数列表,如果关键字在某个列表中,则将其转换为key=value格式的字符串;如果关键字不在某个列表中,则转换为set key=value。在python中,它如下所示: keywords=#list of keywords def convert(**kwargs): s = '' for k,v in kwargs.iteritems(): if k in keywords: s = s + '-%s

我需要在robot中获取一个关键字参数列表,如果关键字在某个列表中,则将其转换为
key=value
格式的字符串;如果关键字不在某个列表中,则转换为
set key=value
。在python中,它如下所示:

keywords=#list of keywords

def convert(**kwargs):
    s = ''
    for k,v in kwargs.iteritems():
        if k in keywords:
            s = s + '-%s=%s ' % (k,v)
        else:
            s = s + '-set %s=%s ' % (k,v)
    return s
*** Keywords ***
| Convert
| [Arguments] | &{args}
| | ${result}= | set variable | ${EMPTY}
| | ${items}= | Get Dictionary items | ${args}
| | :FOR | ${key} | ${value} | IN | @{items}
| | | ${result}= | run keyword if | '${key}' in ${keywords}
| | | ... | catenate | ${result} | ${key}=${value}
| | | ... | ELSE
| | | ... | catenate | ${result} | set ${key}=${value}
| | [return] | ${result}

我知道这可以简单地写成一个python关键字,但我正试图弄清楚是否可以使用Robot。我可以在${kwargs}中使用
:For${arg}进行迭代,但我不确定单独检索键和值将如何工作。

这里是一个简单的示例。我不会在这里尝试重新创建Python函数,因为在Robot中执行条件操作会很快变得复杂。在Robot中使用自己的Python库绝对没有错,所以这可能是更好的方法。 也就是说,您可以在Robot关键字中提取
kwargs

*** Test Cases ***
mytestcase
    mykeyword    abc=1    def=2

*** Keywords ***
mykeyword
    [Arguments]    @{kwargs}
    :FOR    ${arg}    IN    @{kwargs}
    \    ${key}    ${value}=    Evaluate    "${arg}".split("=")
    \    Log    ${key}, ${value}
因此,在这个脚本中,循环的每次迭代都将为提供给函数的每个关键字参数提取
${key}
和${value}`


我还没有使用它,但是Robot Framework的最新版本(2.9)也有字典变量,这可能会使这样的任务更容易一些,也就是说,没有循环。不过,您必须参考参考。这在robot中是可行的,但是代码很难阅读。这当然最好用python来完成

从robot framework 2.8开始,用户关键字可以接受关键字参数。语法使用
&
而不是
$
@
。因此,要编写一个接受关键字参数的关键字,您可以这样做:

keywords=#list of keywords

def convert(**kwargs):
    s = ''
    for k,v in kwargs.iteritems():
        if k in keywords:
            s = s + '-%s=%s ' % (k,v)
        else:
            s = s + '-set %s=%s ' % (k,v)
    return s
*** Keywords ***
| Convert
| [Arguments] | &{args}
| | ${result}= | set variable | ${EMPTY}
| | ${items}= | Get Dictionary items | ${args}
| | :FOR | ${key} | ${value} | IN | @{items}
| | | ${result}= | run keyword if | '${key}' in ${keywords}
| | | ... | catenate | ${result} | ${key}=${value}
| | | ... | ELSE
| | | ... | catenate | ${result} | set ${key}=${value}
| | [return] | ${result}
要迭代键和值,可以将字典转换为列表,然后一次迭代两个列表。它看起来像这样:

keywords=#list of keywords

def convert(**kwargs):
    s = ''
    for k,v in kwargs.iteritems():
        if k in keywords:
            s = s + '-%s=%s ' % (k,v)
        else:
            s = s + '-set %s=%s ' % (k,v)
    return s
*** Keywords ***
| Convert
| [Arguments] | &{args}
| | ${result}= | set variable | ${EMPTY}
| | ${items}= | Get Dictionary items | ${args}
| | :FOR | ${key} | ${value} | IN | @{items}
| | | ${result}= | run keyword if | '${key}' in ${keywords}
| | | ... | catenate | ${result} | ${key}=${value}
| | | ... | ELSE
| | | ... | catenate | ${result} | set ${key}=${value}
| | [return] | ${result}

您可能需要调整返回的内容。我不确定您到底想要什么(您的示例中包含破折号,但描述中没有)

如果该值中包含多个
=
,则可能无法给出您期望的结果。它也只适用于字符串,而不是实际的字典(尽管我不知道这是否重要)。如何测试
&{args}
是否包含键?我正在尝试
${arg1}=Set变量,如果&{args}&{args}['arg1']default1
中的'arg1'。基本上,我尝试在kwargs中模拟一个默认值,而不是在参数中定义它。这看起来很傻,但是当关键字有15个可选参数时,这使得文档比在参数中列出它们更容易阅读