我怎样才能连锁获得()■没有NoneType已没有属性“得到”?

问题描述 投票:-2回答:4

考虑下面的代码:

req = { "foo": True }
if req.get("bar").get("baz") != "qux":
    print("Not Found")

我希望这个打印Not Found,因为有包括含bar baz没有qux。相反,它失败的异常:

AttributeError的:“NoneType”对象有没有属性“得到”

这又如何避免?

python
4个回答
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'

0
投票

NoneType意味着代替任何类或对象你认为你正在使用的情况下,你实际上得到无。这通常意味着,转让或函数调用上述故障或返回意外的结果。

请参考此答案:https://stackoverflow.com/a/8949265/6332980


0
投票

这个错误意味着你的req.get()函数调用返回None,这意味着空引用。因此,在这种情况下,您试图访问一个空引用,它不能做的get财产。


0
投票

如果您希望能够链.get()s,通过{}作为默认为所有,但最后:

if req.get("result", {}).get("action") != "music.play":

这样,如果req没有result,第一get()回报{},这确实又拥有.get()方法。

© www.soinside.com 2019 - 2024. All rights reserved.