2015-09-11 92 views
3

我需要获取机器人中的关键字参数列表,并将它们转换为key=value形式的字符串(如果关键字在某个列表中),并且如果不是,则将其转换为key=value形式的字符串。在蟒蛇,它看起来像这样:机器人框架:通过kwargs循环

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 

我知道这可能是简单地写为一个python的关键字,但我想弄清楚它是否使用机器人的可能。我可以迭代使用:For ${arg} in ${kwargs},但我不确定它将如何单独检索键和值。

回答

2

这是可行的机器人,但代码将很难阅读。这绝对是最好的蟒蛇。

从机器人框架2.8开始,用户关键字可以接受关键字参数。语法使用&而不是$@。因此,要编写接受关键字参数关键字,你会做这样的:

*** 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} 

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

+0

如何测试'&{args}是否包含密钥?我正试着在&{args}&{args} ['arg1'] default1'中设置变量'$ {arg1} =设置变量'arg1'。基本上我试图在kwargs中模拟一个默认值,而不是在参数中定义它。这似乎很愚蠢,但是当关键字有15个可选参数时,这使得文档比参数中列出的文档更容易阅读 – ewok

1

这里有一个简单的例子。我不会尝试在这里重新创建你的Python函数,因为在Robot中做有条件的事情真的很快就会变得复杂。在Robot中使用自己的Python库绝对没有错,所以这可能是更好的途径。 这就是说,你可以在机器人的关键字提取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}和$ {值}`对提供给函数的每个关键字参数。

我还没有使用它,但最新版本的Robot Framework(2.9)也有字典变量,这可能会使这样的任务变得更容易,即没有循环。不过,您必须参考Robot Framework Docs

+0

这可能不会给出你期望的结果,如果该值有多个'='在其中。它也只适用于字符串,而不是实际的字典(尽管我不知道这是否重要)。 –