所选答案在正常情况下可以工作,但我发现有几个明显的问题。如果您搜索 ["spam", "egg", "bacon", "pizza"],由于尝试使用字符串 "pizza" 索引 "well...",它会抛出类型错误。同样,如果您将披萨替换为 2,则会使用它从 "Well..." 中获取索引 2。
所选答案的输出问题:
data = {
"spam": {
"egg": {
"bacon": "Well..",
"sausages": "Spam egg sausages and spam",
"spam": "does not have much spam in it"
}
}
}
print(keys_exists(data, "spam", "egg", "bacon", "pizza"))
>> TypeError: string indices must be integers
print(keys_exists(data, "spam", "egg", "bacon", 2)))
>> l
我认为使用try except可能成为我们过于依赖的技巧。既然我已经需要检查类型,那么干脆就不要使用try except吧。
解决方案:
def dict_value_or_default(element, keys=[], default=Undefined):
'''
Check if keys (nested) exists in `element` (dict).
Returns value if last key exists, else returns default value
'''
if not isinstance(element, dict):
return default
_element = element
for key in keys:
if not isinstance(_element, dict) or key not in _element:
return default
_element = _element[key]
return _element
输出:
print(dict_value_or_default(data, ["spam", "egg", "bacon", "pizza"]))
>> INVALID
print(dict_value_or_default(data, ["spam", "egg", "bacon", 2]))
>> INVALID
print(dict_value_or_default(data, ["spam", "egg", "bacon"]))
>> "Well..."
try except
语句会留下相当多的冗余代码。 - loomitry-except
逻辑,然后每次调用它即可。 - Chris_Randsif type(element) is not dict
改为if not isinstance(element, dict)
。这样它将适用于像 OrderedDict 这样的类型。 - Fonic