使用简单的字典:
myDict{'key1':1, 'key2':2}
我可以安全地使用:
print myDict.get('key3')
即使'key3'不存在也不会抛出错误,因为.get()仍然会返回None。
现在我如何使用嵌套密钥字典实现同样的简单性:
myDict={}
myDict['key1'] = {'attr1':1,'attr2':2}
以下将给出KeyError:
print myDict.get('key1')['attr3']
这将通过:
print myDict.get('key1').get('attr3')
但它会因adn AttributeError而失败:'NoneType'对象没有属性'get':
print myDict.get('key3').get('attr1')
答案 0 :(得分:24)
dict.get
接受其他default
参数。如果没有这样的密钥,则返回value
而不是None
。
print myDict.get('key1', {}).get('attr3')
答案 1 :(得分:4)
关于嵌套字典的主题有一个非常好的blog post from Dan O'Huiginn。他最终建议使用一个更好地处理嵌套的类来对dict进行子类化。这是修改的子类,用于处理试图访问非dict值的键的情况:
class ndict(dict):
def __getitem__(self, key):
if key in self: return self.get(key)
return self.setdefault(key, ndict())
您可以引用嵌套的现有密钥或不存在的密钥。您可以安全地使用括号表示法来访问而不是.get()。如果NestedDict对象上不存在某个键,则会返回一个空的NestedDict对象。初始化有点罗嗦,但如果你需要这个功能,那么它可以为你解决问题。以下是一些例子:
In [97]: x = ndict({'key1': ndict({'attr1':1, 'attr2':2})})
In [98]: x
Out[98]: {'key1': {'attr1': 1, 'attr2': 2}}
In [99]: x['key1']
Out[99]: {'attr1': 1, 'attr2': 2}
In [100]: x['key1']['key2']
Out[100]: {}
In [101]: x['key2']['key2']
Out[101]: {}
In [102]: x['key1']['attr1']
Out[102]: 1
答案 2 :(得分:1)
使用例外:
try:
print myDict['key1']['attr3']
except KeyError:
print "Can't find my keys"
答案 3 :(得分:0)
这是正常的,因为key3不存在,所以
myDict.get('key3')
不返回..
NoneType对象没有属性..
所以你必须存储myDict.get('key3')的值,测试它是否为null然后在存储的项目上使用get方法