web-dev-qa-db-ja.com

Robot Frameworkのループオーバー辞書

RFの辞書をループする適切な方法はありますか?私はPythonicの方法を使用しましたが、失敗しました:

:FOR  ${key}  ${value}  IN  &{dict}

出力:FORループ値の数は、その変数の倍数である必要があります。 2つの変数を取得しましたが、1つの値を取得しました。

同じですが、辞書をスカラー変数としてポイントしました。ドキュメントに例が見つかりませんでした。誰かがそれを解決しましたか?

追伸.

私はあなたがkwを使用するという回避策を知っています。辞書キーを取得し、辞書値を取得し、値を更新するには、Set To Dictionary $ {key} $ {new_value}を使用しますが、これは人間に不便であるようで、複数のforループの反復を1つではなく使用しています。

9
user2678074
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}
13
Jan Kovařík

辞書のキーを反復処理するために、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}
_
8
Todor Minakov

別の回避策は、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

3
chmcc

ソリューションを確認:

: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]}
2