Robotframework 机器人框架中的循环字典
在RF中有没有一种正确的方法来循环字典? 我使用了pythonic方法,但失败了:Robotframework 机器人框架中的循环字典,robotframework,Robotframework,在RF中有没有一种正确的方法来循环字典? 我使用了pythonic方法,但失败了: :FOR ${key} ${value} IN &{dict} 输出: FOR循环值的数量应该是其变量的倍数。有2个变量,但有1个值 同样,当我将字典作为标量变量时。不过,我在文档中找不到示例。 有人解决了吗 附言 我知道您使用kw的解决方案。获取字典键并获取字典值,然后,要更新您使用的值,请将其设置为Dictionary${key}${new_value},但这似乎对人类不友好,并且使用多个f
:FOR ${key} ${value} IN &{dict}
输出:
FOR循环值的数量应该是其变量的倍数。有2个变量,但有1个值
同样,当我将字典作为标量变量时。不过,我在文档中找不到示例。
有人解决了吗
附言
我知道您使用kw的解决方案。获取字典键并获取字典值,然后,要更新您使用的值,请将其设置为Dictionary${key}${new_value},但这似乎对人类不友好,并且使用多个for循环而不是一个for循环。另一种解决方法是在for循环期间使用关键字“Get From Dictionary”
Loop Through Dict
&{mydict} Create Dictionary a=1 b=2
:FOR ${key} IN @{mydict.keys()}
\ Log ${mydict["${key}"]}
Loop Through Dict And Multiplicate Values
&{mydict} Create Dictionary a=1 b=2
:FOR ${key} IN @{mydict.keys()}
\ ${new_value} Evaluate ${mydict["${key}"]}*2
\ Set To Dictionary ${mydict} ${key}=${new_value}
Log ${mydict}
Loop through and Log key and value in dict
[Documentation] Loops through each key and stores the key value
... in a variable that can be used during the for
... loop, as if you were iterating through python
... with "for key, value in dict.iteritems()".
&{mydict} Create Dictionary a=1 b=2
:FOR ${key} IN @{mydict.keys()}
\ ${value}= Get From Dictionary ${mydict} ${key}
\ Log ${key}, ${value}
参考:要迭代字典的键,根本不需要使用任何python方法,而是使用Robotframework的
@
修饰符进行列表扩展。例如:
${mydict} Create Dictionary a=1 b=2
:FOR ${key} IN @{mydict}
\ Log The current key is: ${key}
# there are at least to ways to get the value for that key
# "Extended variable syntax", e.g. direct access:
\ Log The value is: ${mydict['${key}']}
# or using a keyword from the Collections library:
\ ${value}= Get From Dictionary ${mydict} ${key}
\ Log The value through Collections is: ${value}
键上的循环可以直接工作,因为在python中,字典的list()
cast实际上就是它的键列表。示例代码:
mydict = {'a': 1, 'b': 2}
print(list(mydict))
# the output is
# ['a', 'b']
有一个python的dict方法
items()
,它迭代字典并返回一个键、值的元组。遗憾的是,在Robot框架中并没有直接的循环替代物,然而——这可以用机器人来完成。它返回一个一维列表,格式为
['key1', value_of_key1, 'key2', value_of_key2,]
将其与@
列表展开相结合,您可以在每个循环中同时获得键和值:
${mydict} Create Dictionary a=1 b=2
${items} Get Dictionary Items ${mydict}
:FOR ${key} ${value} IN @{items}
\ Log The current key is: ${key}
\ Log The value is: ${value}
检查解决方案:
:FOR ${key} IN @{mydict}
# works as @{mydict.keys()}
:FOR ${key} ${value} IN @{mydict.items()}
# doesn't work at all
找到了另一个有效的解决方案:
:FOR ${key} ${value} IN ZIP ${mydict.keys()} ${mydict.values()}
# And another less readable (can work without setters)
:FOR ${el} IN @{mydict.items()}
\ ${key}= Set Variable ${el[0]}
\ ${value}= Set Variable ${el[1]}
试试这个(RF:3.2++):
我发现这个版本更具可读性(使用RF 3.2+) 这也有效:
FOR ${key} IN @{res.keys()}
Log ${key}
END
这在RF 3.2.2中运行良好这就是我提到的解决方法。在你的例子中并没有那么糟糕,但试着用数字乘以值并更新。。。在python中,仍然是一个for循环,这里。。。可怕的。这甚至可能被转发给RF团队作为改进。嗯,那我就不明白了。您可以通过
:FOR${key}在{dict.keys()}
中循环浏览字典键列表,或者通过:FOR${value}在{dict.values()}
中循环浏览字典值列表,而无需任何其他关键字。啊,现在扩展注释后,它更清晰了。是的,在RF中执行这样的循环是不愉快的,我肯定会用python编写尽可能多的KW。无论如何,你可以在单个循环中更新字典,就像在编辑过的答案中一样。这种方法比python(我指RF)更糟糕,但你已经尽可能地在python版本3.6之前(包括所有2.x版本)中做到了,谢谢:)字典的顺序没有保证;因此,同时调用${mydict.keys()}${mydict.values()}
可能会返回一个键和另一个键的值。
FOR ${key} IN @{mydict.items()}
Log To Console ${key}: ${mydict}[${key}]
END
FOR ${key} IN @{res.keys()}
Log ${key}
END
FOR ${key} ${value} IN &{dictionary}
Log To Console key = ${key}, value = ${value}
END