考虑下面的代码:
req = { "foo": True }
if req.get("bar").get("baz") != "qux":
print("Not Found")
我希望这个打印Not Found
,因为有包括含bar
baz
没有qux
。相反,它失败的异常:
AttributeError的:“NoneType”对象有没有属性“得到”
这又如何避免?
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'
NoneType意味着代替任何类或对象你认为你正在使用的情况下,你实际上得到无。这通常意味着,转让或函数调用上述故障或返回意外的结果。
这个错误意味着你的req.get()
函数调用返回None
,这意味着空引用。因此,在这种情况下,您试图访问一个空引用,它不能做的get
财产。
如果您希望能够链.get()
s,通过{}
作为默认为所有,但最后:
if req.get("result", {}).get("action") != "music.play":
这样,如果req
没有result
,第一get()
回报{}
,这确实又拥有.get()
方法。