这似乎以前工作得很好,但突然我的代码停止工作了。否则,两者都会成功运行,但最后会出现关键错误。
这里的数据来自名为 userdata 的 json。
这是代码示例 1:
if(userdata["id"] == "Stage1"):
for j in range(len(userdata['Data'])):
if(userdata['Data'][j]['user']==userName):
address=str(processdata['Data'][j]['address'])
addressInst = ''.join(filter(str.isalnum, address))
print(addressInst)
else:
print('not available')
错误:
KeyError: 'user'
我从 API 获取的 json 中获取用户名,然后调用另一个 api 来更新其地址。我在此 if 语句之后调用另一个 API,但由于某些原因,我隐藏了此处的代码。
if(userdata['Data'][j]['user']==userName):
我能够成功调用 API,但最后我每次都会收到上述错误,因此我的函数无法运行。
我实际上想避免 if else,谁能告诉我如何保存匹配数据
userdata['Data'][j]['user']==userName
然后调用API来相应地更新数据,这样我就可以避免错误?
最佳答案
您正在尝试访问 JSON 中不存在的 key 。如果键不存在,使用get
返回默认值:
if(userdata["id"] == "Stage1"):
for data in userdata['Data']:
if (data.get('user') == userName):
address = data.get('address', [])
addressInst = ''.join(filter(str.isalnum, address))
print(addressInst)
else:
print('Not available')
或者没有 if ... else ...
的较短版本:
if(userdata["id"] == "Stage1"):
for data in filter(lambda d: d.get('user') == userName, userdata['Data']):
address = data.get('address', [])
addressInst = ''.join(filter(str.isalnum, address))
print(addressInst)
它的作用是:
filter
为列表中 lambda 返回 True 的项目返回一个迭代器d.get('user')
如果在d
中找不到键 'user',则返回 None,而不是出错。
除非您确定字典将包含键,否则最好调用 aDict.get(key, defaultValue)
以避免错误。
关于python - 如果 else 最后失败并抛出关键错误 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62489081/