考虑以下代码:
req = { "foo": True }
if req.get("bar").get("baz") != "qux":
print("Not Found")
我希望它能打印Not Found
,因为不存在包含bar
的{{1}}的{{1}}。相反,它失败并带有异常:
AttributeError:'NoneType'对象没有属性'get'
如何避免这种情况?
答案 0 :(得分:0)
NoneType意味着实际上没有任何内容,而不是您认为正在使用的任何类或对象的实例。这通常意味着在上面的赋值或函数调用失败或返回了意外结果。
答案 1 :(得分:0)
此错误意味着您对req.get()
函数的调用返回了None
,这意味着空引用。因此,在这种情况下,您尝试访问空引用的get
属性,但无法完成。
答案 2 :(得分:0)
如果您希望链接.get()
,请将{}
作为除最后一个以外的所有其他对象的默认设置:
if req.get("result", {}).get("action") != "music.play":
这样,如果req
没有result
,则第一个get()
返回{}
,而确实又有一个{{1} }方法。
答案 3 :(得分:0)
req.get("bar").get("baz")
仅在第一个get
返回带有右键的字典时才有效
In [182]: req = {'bar': {'baz': 'foo'}}
In [183]: req.get('bar')
Out[183]: {'baz': 'foo'}
In [184]: req.get('bar').get('baz')
Out[184]: 'foo'
第二个get
适用于第一个返回的对象。
In [185]: req = { "foo": True }
In [186]: req.get('bar')
# returned None
另一种写法是:
req['bar']['baz'] # req must be a nested dictionary
get
使用default
,它可能是另一本字典。实际上,它可以返回字典本身-反复:
In [187]: req.get('bar', req)
Out[187]: {'foo': True}
In [188]: req.get('bar', req).get('baz')
In [189]: req.get('bar', req).get('baz', req)
Out[189]: {'foo': True}
In [190]: req.get('bar', req).get('baz', req).get('foo')
Out[190]: True
这将返回您的NotFound
:
In [193]: req.get('bar', {}).get('baz', 'fppbar')
Out[193]: 'fppbar'