如何在没有NoneType的情况下链接.get()而没有属性'get'?

时间:2019-02-04 05:27:46

标签: python

考虑以下代码:

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

我希望它能打印Not Found,因为不存在包含bar的{​​{1}}的{​​{1}}。相反,它失败并带有异常:

  

AttributeError:'NoneType'对象没有属性'get'

如何避免这种情况?

4 个答案:

答案 0 :(得分:0)

NoneType意味着实际上没有任何内容,而不是您认为正在使用的任何类或对象的实例。这通常意味着在上面的赋值或函数调用失败或返回了意外结果。

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

答案 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'