有更干净的方法吗?我正在检查嵌套字典中的一个特定键,并将其赋值给一个变量。我很快就会使用它来插入mysql。
我的主要问题是,如果键不存在(有时会发生),我不希望代码失败,我只想将变量发送到空.。
这段代码似乎有效,但我必须做一些类似于大约20个不同的键值的事情,所以我想确定我正在以最好的方式来完成它。
if 'Model' in ItemAttributes:
Model=ItemAttributes['Model']['value']
else:
Model=''发布于 2018-07-01 16:51:07
dict.get
这里有一个解决方案:
Model = ItemAttributes.get('Model', {}).get('value', '')如果ItemAttributes字典中不存在“模型”键,则返回一个空字典,在该字典上使用dict.get('value', '')。当然,如果"Model“键不存在,这将返回一个空字符串。
如果/或
另一种解决方案是添加一个额外的函数调用,并让这个函数测试键是否存在。这里我们使用三元语句。这实际上是您现在正在做的事情,但是为了便于重复访问,可以将逻辑封装在一个函数中:
def get_value(d, key1, key2):
return d[key1][key2] if key1 in d else ''
Model = get_value(ItemAttributes, 'Model', 'value')捕捉KeyError
一个更通用的解决方案是使用try / except和捕捉KeyError。如果缺少任何键,该函数将返回一个空字符串。否则,reduce + getitem将通过嵌套字典循环访问给定键列表的适当值。
from functools import reduce
from operator import getitem
def getFromDict(dataDict, mapList):
try:
return reduce(getitem, mapList, dataDict)
except KeyError:
return ''
Model = getFromDict(ItemAttributes, ['Model', 'Value'])发布于 2018-07-01 16:49:32
model = ItemAttributes.get('Model', {}).get('value', '')不确定是否更好,但它有效!:)
发布于 2018-07-01 17:05:44
使用get通常是最好的解决方案。另一个解决方案是捕获KeyError异常:
try:
Model=ItemAttributes['Model']['value']
except KeyError:
Model=''模型将被设置为'',如果'Model'不在ItemAttributes中,或者'value'不在ItemAttributes['Model']中
https://stackoverflow.com/questions/51125170
复制相似问题