Robotframework 机器人框架中的循环字典

Robotframework 机器人框架中的循环字典,robotframework,Robotframework,在RF中有没有一种正确的方法来循环字典? 我使用了pythonic方法,但失败了: :FOR ${key} ${value} IN &{dict} 输出: FOR循环值的数量应该是其变量的倍数。有2个变量,但有1个值 同样,当我将字典作为标量变量时。不过,我在文档中找不到示例。 有人解决了吗 附言 我知道您使用kw的解决方案。获取字典键并获取字典值,然后,要更新您使用的值,请将其设置为Dictionary${key}${new_value},但这似乎对人类不友好,并且使用多个f

在RF中有没有一种正确的方法来循环字典? 我使用了pythonic方法,但失败了:

: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