RFの辞書をループする適切な方法はありますか?私はPythonicの方法を使用しましたが、失敗しました:
:FOR ${key} ${value} IN &{dict}
出力:FORループ値の数は、その変数の倍数である必要があります。 2つの変数を取得しましたが、1つの値を取得しました。
同じですが、辞書をスカラー変数としてポイントしました。ドキュメントに例が見つかりませんでした。誰かがそれを解決しましたか?
追伸.
私はあなたがkwを使用するという回避策を知っています。辞書キーを取得し、辞書値を取得し、値を更新するには、Set To Dictionary $ {key} $ {new_value}を使用しますが、これは人間に不便であるようで、複数のforループの反復を1つではなく使用しています。
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}
辞書のキーを反復処理するために、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 a list()
のディクショナリのキャストは実際にはそのキーのリストであるため、キーに対するループはすぐに機能します。サンプルコード:
_mydict = {'a': 1, 'b': 2}
print(list(mydict))
# the output is
# ['a', 'b']
_
Pythonのdictメソッドitems()
があり、ディクショナリを反復処理して、キーと値のタプルを返します。残念ながら、Robot Frameworkのforループに直接代用するものはありませんが、これは _Get Dictionary Items
_キーワード で実行できます。 1次元のリストを次の形式で返します
_['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ループ中にキーワード「Get From Dictionary」を使用することです。
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}
参照: http://robotframework.org/robotframework/latest/libraries/Collections.html#Get%20From%20Dictionary
ソリューションを確認:
: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]}