从字典列表中访问字典值

4

我正在使用一个返回类似下面这样的字典列表的关键字。如果我遍历这些字典,我就可以获取到其中的值。例如:

${vPools} =      list all vpools
: FOR    ${Item}    IN    @{vPools}
\    ${vPoolID} =     ${Item["VPoolID"]}

有没有一种方法可以直接访问值而无需循环?类似以下方式:
${vPoolID} =   @{vPools[0]}["VPoolID"]

第一个列表项的代码是什么?我尝试了很多不同的方法,但似乎找不到正确的方法。
17:23:30.815    INFO    [
    {
        "GroupType": 3, 
        "GroupTypeEnum": 3, 
        "Name": "GS - Flash - Protection: 1 - QoS: Gold", 
        "OptimizationSetting": 0, 
        "OptimizationSettingEnum": 0, 
        "PhysicalPoolID": "7efaf334-b723-4be6-af56-3a626562b553", 
        "ProtectionSetting": 1, 
        "QoSClassPriorityID": 1, 
        "Secured": false, 
        "TotalCapacity": 0, 
        "UsedCapacity": 0, 
        "VPoolID": "be7d518e-9851-4ad5-bd59-c7987fc3dd9b"
    }, 
    {
        "GroupType": 3, 
        "GroupTypeEnum": 3, 
        "Name": "GS - Flash - Protection: 1 - QoS: Silver", 
        "OptimizationSetting": 0, 
        "OptimizationSettingEnum": 0, 
        "PhysicalPoolID": "7efaf334-b723-4be6-af56-3a626562b553", 
        "ProtectionSetting": 1, 
        "QoSClassPriorityID": 2, 
        "Secured": false, 
        "TotalCapacity": 0, 
        "UsedCapacity": 0, 
        "VPoolID": "1a82e650-589e-4077-878b-48eea7211278"
    }, 
    {
        "GroupType": 3, 
        "GroupTypeEnum": 3, 
        "Name": "GS - Flash - Protection: 1 - QoS: Bronze", 
        "OptimizationSetting": 0, 
        "OptimizationSettingEnum": 0, 
        "PhysicalPoolID": "7efaf334-b723-4be6-af56-3a626562b553", 
        "ProtectionSetting": 1, 
        "QoSClassPriorityID": 3, 
        "Secured": false, 
        "TotalCapacity": 0, 
        "UsedCapacity": 0, 
        "VPoolID": "5a082095-cbb5-460a-a0fc-0a8dc90d007d"
    }
]()

你的答案和第二个答案都非常好用 :-) - Perry
3个回答

4

如果使用扩展变量语法,可以访问嵌套集合。在使用DatabaseLibrary和SudsLibrary时非常方便。请确保将键和索引放在花括号内,并将键用引号括起来。

List of Dictionaries
    ${a}    Create Dictionary    a=1    b=2
    ${b}    Create Dictionary    x=5    y=7
    ${stuff}    Create List    ${a}    ${b}
    ${item}    Set Variable    ${stuff[0]['b']}
    Should Be Equal    ${stuff[1]['x']}    5

所以尝试:

${vPoolID}    Set Variable    ${vPools[0]["VPoolID"]}

如果您引用单个项目,请不要使用@,而是使用$。


干得漂亮! - Perry

4

Collections库有一个关键字“从字典中获取”。我认为这正是你想要的:

*** Settings ***
Library    Collections

*** Test Cases ***
Dictionary
    ${dict1}=      Create Dictionary     GroupType=3    VPoolID=be7d518e-9851-4ad5-bd59-c7987fc3dd9b
    ${dict2}=      Create Dictionary     GroupType=3    VPoolID=1a82e650-589e-4077-878b-48eea7211278
    ${vPools}=     Create List           ${dict1}       ${dict2}
    ${vPoolID}=    Get From Dictionary   @{vPools}[0]   VPoolID

我回答的原因是,如果您不想将值分配给变量,而只想像“应该相等”一样使用它,则使用从字典中获取需要额外的行和变量。 - ombre42
这个和第一个评论都有效!非常感谢 :-) 我的尝试往往看起来像第一个答案,而你的完全不同。两者都是有教育意义的。这是我第一次使用机器人框架。 - Perry
我也学习了一种新的方法来访问字典列表,这种方法是从ombre42的回答中学到的。 - Pekka

0

你的闭合花括号需要放在第二组方括号之外。

${vPoolID} =   ${vPools[0]["VPoolID"]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接