【问题标题】:robotframework: Dictionary has no key error机器人框架:字典没有关键错误
【发布时间】:2020-09-25 08:09:23
【问题描述】:

当我运行测试 DICT-WITH-LISTS 时,我收到一个错误,说字典没有键。但是正如您所看到的,我确实打印了键,并且其值应该是列表的键似乎就在那里。
不确定我做错了什么以及为什么我的密钥在错误消息中的显示方式不同。 我将非常感谢解决此问题的任何帮助


*** Variables ***
${p1}=  P-1
${f1}=  F-2
${p2}=  P-2
${p3}=  P-3


*** Test Cases ***
DICT-WITH-LISTS
    [tags]   run
    ${resNameList} =   Create List
    ${laneInfoList}=      Create Dictionary     L0=res1   L1=res2   L2=res3   L3=res4   L4=res5
    ${lane2resNameMappingList}=     Create List
    log to console   LANE ID LIST : ${laneInfoList.keys()}
    :FOR    ${laneID}     IN      @{laneInfoList.keys()}
    \       Append To List  ${resNameList}  ${laneInfoList['${laneID}']}
    \       ${lane2resName}=     Create dictionary   lane=${laneID}   resName=${laneInfoList['${laneID}']}
    \       Append To List  ${lane2resNameMappingList}    ${lane2resName}

    ${resName2resObjMappingList}=      Create Dictionary
    @{resNameList}=   Remove Duplicates  ${resNameList} 
    log to console  res LIST: @{resNameList}
    ${totalres}=  Get length   ${resNameList}
    : FOR    ${index}    IN RANGE    0    ${totalres}
    \       log to console   INDEX:${index} res:${resNameList}[${index}] AFMObj:afm${index}
    \       set to dictionary    ${resName2resObjMappingList}   ${resNameList}[${index}]=afm${index}

    log to console  lane2resNameMappingList: ${lane2resNameMappingList}
    log to console  resName2resObjMappingList: ${resName2resObjMappingList}
    set global variable  ${lane2resNameMappingList}
    set global variable  ${resName2resObjMappingList}

    ${totalObjList}=  create list  ${p1}  ${f1}  ${p2}  ${p3}
    ${totalObjsInTest}=  Get length   ${totalObjList}
    ${totalLanesAvailable}=  Get length   ${lane2resNameMappingList}

    ${totalObjs} =  Set Variable IF  ${totalObjsInTest} > ${totalLanesAvailable}  ${totalLanesAvailable}  ${totalObjsInTest}
    ${object2resMappingList}=      Create Dictionary

    ${resList} =   Create List
    log to console   Attaching res for a total of ${totalObjs} objects based on current availability!
    : FOR    ${index}    IN RANGE    0    ${totalObjs}
    \    log to console   Obj:${totalObjList}[${index}] 
    \    log to console   res: ${lane2resNameMappingList[${index}]['resName']} 
    \    log to console   res Obj:${resName2resObjMappingList['${lane2resNameMappingList[${index}]['resName']}']}
    \    log to console   Lane:${lane2resNameMappingList[${index}]['lane']}
    \    log to console   BW:${lane2resNameMappingList[${index}]['lane']}
    \    ${isKeyPresent}=    Run Keyword And Return Status       Dictionary Should Contain Key       ${object2resMappingList}      ${totalObjList}[${index}]
    \    log to console   KEY:${isKeyPresent}
    \    Run Keyword Unless  ${isKeyPresent}    set to dictionary    ${object2resMappingList}   ${totalObjList}[${index}]=${resList}
    \    log to console  AFTER:object2resMappingList: ${object2resMappingList}
    \    log to console  OBJ:${totalObjList}[${index}] VALUE:${resName2resObjMappingList['${lane2resNameMappingList[${index}]['resName']}']}
    \    log to console   DICT : ${object2resMappingList.keys()}
    \    log to console   DICT : &{object2resMappingList} KEY:${totalObjList}[${index}]
    \    Run Keyword  Append To List  &{object2resMappingList}[${totalObjList}[${index}]]  ${resName2resObjMappingList['${lane2resNameMappingList[${index}]['resName']}']}
    \    ${resList} =   Create List
    log to console  object2resMappingList: ${object2resMappingList}

输出

DICT-WITH-LISTS ...车道 ID 列表:odict_keys(['L0', 'L1', 'L2', 'L3', 'L4'])
....res LIST: ['res1', 'res2', 'res3', 'res4', 'res5']
DICT-WITH-LISTS .INDEX:0 res:res1 AFMObj:afm0
INDEX:1 res:res2 AFMObj:afm1
索引:2 res:res3 AFMObj:afm2
INDEX:3 res:res4 AFMObj:afm3
索引:4 res:res5 AFMObj:afm4
.lane2resNameMappingList: [{'lane': 'L0', 'resName': 'res1'}, {'lane': 'L1', 'resName': 'res2'}, {'lane': 'L2', ' resName':'res3'},{'lane':'L3','resName':'res4'},{'lane':'L4','resName':'res5'}] .resName2resObjMappingList: {'res1': 'afm0', 'res2': 'afm1', 'res3': 'afm2', 'res4': 'afm3', 'res5': 'afm4'}
DICT-WITH-LISTS ....根据当前可用性为总共 4 个对象附加资源!
.Obj:P-1
资源:资源1
res 对象:afm0
车道:L0
体重:L0
关键:假
之后:object2resMappingList:{'P-1':[]}
对象:P-1 值:afm0
DICT : odict_keys(['P-1'])
DICT : {'P-1': []} KEY:P-1
带列表的字典 |失败 | 字典 '&{object2resMappingList}' 没有键 '['P-1', 'F-2', 'P-2', 'P-3'][0'。


测试 |失败 |
1 次关键测试,0 次通过,1 次失败
共 1 次测试,0 次通过,1 次失败

【问题讨论】:

  • SO中有“minimal reproducible example”这个概念,不是code review系统;下次请把代码限制在它的相关部分。
  • 我想深入了解我是如何使用字典和列表的。但我会记住将提供的代码保持在最低限度。谢谢

标签: list dictionary append robotframework


【解决方案1】:

更改您在此处引用密钥的方式,来自:

Run Keyword  Append To List  &{object2resMappingList}[${totalObjList}[${index}]]  ${resName2resObjMappingList['${lane2resNameMappingList[${index}]['resName']}']}

到:

Run Keyword  Append To List  ${object2resMappingList['${totalObjList}[${index}]']}  ${resName2resObjMappingList['${lane2resNameMappingList[${index}]['resName']}']}

【讨论】:

  • 非常感谢您在删除 "'$' 之间的附加空格后这项工作有效但我不清楚为什么我的用法不起作用。我试图按照链接中提到的示例@ 987654321@
  • RF 有两种方法来引用字典的键 - ${a dict['a key']} 或 ${a dict}[a key];您使用的第二个更不稳定,尤其是变量分辨率。
  • 谢谢。解释非常有用。这是否记录在某处?
  • 我知道这种行为主要来自经验,并且对变量的解析代码进行了一些挖掘(我必须说这相当复杂)。
  • 再次感谢您抽出宝贵时间如此迅速地回答我的问题
猜你喜欢
  • 2021-08-15
  • 2013-11-08
  • 2017-12-07
  • 1970-01-01
  • 2015-10-14
  • 2019-06-11
  • 2017-12-19
  • 2020-04-21
  • 2020-05-03
相关资源
最近更新 更多