在您的代码中:
try:
value1 = dictionary2.get("optional").get("value1")
except AttributeError:
value1 = " "
您可以使用括号和except KeyError
:
try:
value1 = dictionary2["optional"]["value1"]
except KeyError:
value1 = " "
如果这对于调用者来说太冗长,请添加一个助手:
def get_or_default(d, *keys, default=None):
try:
for k in keys:
d = d[k]
except (KeyError, IndexError):
return default
return d
if __name__ == "__main__":
d = {"a": {"b": {"c": [41, 42]}}}
print(get_or_default(d, "a", "b", "c", 1)) # => 42
print(get_or_default(d, "a", "b", "d", default=43)) # => 43
您还可以对 dict 进行子类化并使用元组括号索引,例如 NumPy 和 Pandas:
class DeepDict(dict):
def __init__(self, d, default=None):
self.d = d
self.default = default
def __getitem__(self, keys):
d = self.d
try:
for k in keys:
d = d[k]
except (KeyError, IndexError):
return self.default
return d
def __setitem__(self, keys, x):
d = self.d
for k in keys[:-1]:
d = d[k]
d[keys[-1]] = x
if __name__ == "__main__":
dd = DeepDict({"a": {"b": {"c": [42, 43]}}}, default="foo")
print(dd["a", "b", "c", 1]) # => 43
print(dd["a", "b", "c", 11]) # => "foo"
dd["a", "b", "c", 1] = "banana"
print(dd["a", "b", "c", 1]) # => "banana"
但是,如果其他开发人员感到困惑,并且您希望充实其他预期方法,如中所述,则可能会产生工程成本如何“完美”覆盖字典?(将此视为概念验证草图)。最好不要太聪明。