在机器人框架中安全地从字典中获取密钥
Get a key from a dictionary safely in robot framework
我有一个只有一个功能的库,可以安全地从字典中获取键。这可能在测试套件中吗?
def safe_get(dict_obj, key):
val = dict_obj.get(key)
if val is None:
val = {}
return val
有没有办法使用 Run_Keyword_If
或 Set_Variable_If
之类的东西来做到这一点?
*** Variables ***
&{Charles Dictionary}
*** Test Cases ***
Safely Get a Key from Dictionary
Set To Dictionary ${Charles Dictionary}
... MyInterest Hiking
... YourInterest Swimming
Work with Interests ${Charles Dictionary}
*** Keywords ***
Work with Interests [Arguments] ${Charles Dictionary}
${val}= Get This Value From Dictionary ${Charles Dictionary} MyInterest
Run Keyword If '${val}'!='None' Log That key is present in the dictionary! console=yes
Run Keyword If '${val}'=='None' Log That key wasn't present in the dictionary! console=yes
Get This Value From Dictionary [Arguments] ${Dictionary Name} ${Key}
${KeyIsPresent}= Run Keyword And Return Status Dictionary Should Contain Key ${Dictionary Name} ${Key}
${Value}= Run Keyword If ${KeyIsPresent} Get From Dictionary ${Dictionary Name} ${Key}
Return From Keyword ${Value}
这里,Charles Dictionary
是我在 Variables
部分声明的字典名称。我给它设置了 2 key-value 对,调用关键字 Work with Interests
,并将这个字典作为参数传递给它。
Work with Interests
关键字从字典中获取值,允许 None 和 not-None 值。
如果字典中有键,变量 val
将获得该键的关联值。如果字典 没有 那个键,变量 val
将得到一个值 None
.
我还说明了如何处理 None 而不是 None 值以调用不同的关键字。我使用 Log
关键字来说明,但实际上,您可以调用任何您喜欢的关键字,built-in 关键字或您自己的自定义关键字。
希望对您有所帮助。如果没有,请告诉我。
TL;DR:
假设您使用的是机器人 2.9 或更高版本,您可以使用 Evaluate 关键字在字典上调用 get
方法,这将允许您在键时指定默认值不存在。
例如:
| | ${data}= | create dictionary | ...
| | ${value}= | evaluate | $data.get("some key", "default value")
说明
从 robotframework 2.9 开始,您可以通过删除大括号直接访问表达式中的变量(请参阅 Evaluating Expressions in the BuiltIn 库文档)。例如,如果您有一个名为 ${data}
的字典,您可以在表达式中使用 $data
.
的实际变量
这使得在 python 表达式中使用变量变得非常容易。例如,如果您想在字典没有键时提供默认值,您可以通过使用 Evaluate 关键字和类似 $data.get(...)
的关键字来调用字典的 get
方法.
另请注意,机器人将变量 ${None}
定义为 python 值 None
( 而不是 字符串 "None"
),您可以在表达式中使用它来检查值是否为 None
。
下面的例子展示了如何使用evaluate
调用字典的get
方法。第一个测试显示您可以检查 None
值,第二个示例显示如何提供默认值。
*** Settings ***
| Library | Collections
*** Test Cases ***
| Get value from dictionary, returning None if key not in dictionary
| | ${data}= | Create dictionary | key1=one | key2=two
| | ${value}= | Evaluate | $data.get("key3")
| | should be equal | ${value} | ${None}
| Get value from dictionary, returning default value if key not in dictionary
| | ${data}= | Create dictionary | key1=one | key2=two
| | ${value}= | Evaluate | $data.get("key3", "default value")
| | should be equal as strings | ${value} | default value
当然,如果您希望默认值是一个新字典(如您的问题所暗示的那样),您也可以这样做:
| | ${value}= | Evaluate | $data.get("key3", {})
我有一个只有一个功能的库,可以安全地从字典中获取键。这可能在测试套件中吗?
def safe_get(dict_obj, key):
val = dict_obj.get(key)
if val is None:
val = {}
return val
有没有办法使用 Run_Keyword_If
或 Set_Variable_If
之类的东西来做到这一点?
*** Variables ***
&{Charles Dictionary}
*** Test Cases ***
Safely Get a Key from Dictionary
Set To Dictionary ${Charles Dictionary}
... MyInterest Hiking
... YourInterest Swimming
Work with Interests ${Charles Dictionary}
*** Keywords ***
Work with Interests [Arguments] ${Charles Dictionary}
${val}= Get This Value From Dictionary ${Charles Dictionary} MyInterest
Run Keyword If '${val}'!='None' Log That key is present in the dictionary! console=yes
Run Keyword If '${val}'=='None' Log That key wasn't present in the dictionary! console=yes
Get This Value From Dictionary [Arguments] ${Dictionary Name} ${Key}
${KeyIsPresent}= Run Keyword And Return Status Dictionary Should Contain Key ${Dictionary Name} ${Key}
${Value}= Run Keyword If ${KeyIsPresent} Get From Dictionary ${Dictionary Name} ${Key}
Return From Keyword ${Value}
这里,Charles Dictionary
是我在 Variables
部分声明的字典名称。我给它设置了 2 key-value 对,调用关键字 Work with Interests
,并将这个字典作为参数传递给它。
Work with Interests
关键字从字典中获取值,允许 None 和 not-None 值。
如果字典中有键,变量 val
将获得该键的关联值。如果字典 没有 那个键,变量 val
将得到一个值 None
.
我还说明了如何处理 None 而不是 None 值以调用不同的关键字。我使用 Log
关键字来说明,但实际上,您可以调用任何您喜欢的关键字,built-in 关键字或您自己的自定义关键字。
希望对您有所帮助。如果没有,请告诉我。
TL;DR:
假设您使用的是机器人 2.9 或更高版本,您可以使用 Evaluate 关键字在字典上调用 get
方法,这将允许您在键时指定默认值不存在。
例如:
| | ${data}= | create dictionary | ...
| | ${value}= | evaluate | $data.get("some key", "default value")
说明
从 robotframework 2.9 开始,您可以通过删除大括号直接访问表达式中的变量(请参阅 Evaluating Expressions in the BuiltIn 库文档)。例如,如果您有一个名为 ${data}
的字典,您可以在表达式中使用 $data
.
这使得在 python 表达式中使用变量变得非常容易。例如,如果您想在字典没有键时提供默认值,您可以通过使用 Evaluate 关键字和类似 $data.get(...)
的关键字来调用字典的 get
方法.
另请注意,机器人将变量 ${None}
定义为 python 值 None
( 而不是 字符串 "None"
),您可以在表达式中使用它来检查值是否为 None
。
下面的例子展示了如何使用evaluate
调用字典的get
方法。第一个测试显示您可以检查 None
值,第二个示例显示如何提供默认值。
*** Settings ***
| Library | Collections
*** Test Cases ***
| Get value from dictionary, returning None if key not in dictionary
| | ${data}= | Create dictionary | key1=one | key2=two
| | ${value}= | Evaluate | $data.get("key3")
| | should be equal | ${value} | ${None}
| Get value from dictionary, returning default value if key not in dictionary
| | ${data}= | Create dictionary | key1=one | key2=two
| | ${value}= | Evaluate | $data.get("key3", "default value")
| | should be equal as strings | ${value} | default value
当然,如果您希望默认值是一个新字典(如您的问题所暗示的那样),您也可以这样做:
| | ${value}= | Evaluate | $data.get("key3", {})