Python 间歇性地抛出“AttributeError:‘NoneType’对象在同一字典上没有属性‘get’”

swd*_*don 1 python dictionary

我有一个像这样的嵌套字典:

mail = {
   'data': { 'from': {'text': '123@example.com'}}
    # some other entries...
}
Run Code Online (Sandbox Code Playgroud)

from我正在尝试使用以下代码复制值:

data = mail.get('data')
new_dict['parse']['from'] = data.get('from').get('text')
Run Code Online (Sandbox Code Playgroud)

第二行抛出异常:

AttributeError: 'NoneType' object has no attribute 'get'

奇怪的是,这种情况只是有时发生。如果我在第二行之前添加一条打印语句,例如:

data = mail.get('data')
print(type(data.get('from')))
new_dict['parse']['from'] = data.get('from').get('text')
Run Code Online (Sandbox Code Playgroud)

错误消失了,我得到了<class 'dict'>预期的结果。如果我删除 print 语句,它有时会起作用,有时会引发错误。代码或数据没有任何其他变化。我使用的原因get()是在密钥丢失的情况下安全地检索值。

Gra*_*her 5

在调用中data.get('from').get('text'),如果data不包含该密钥'from',则会返回NoneNone.get('text')然后引发您看到的异常,因为None对象没有get方法(当然)。

解决这个问题的方法是传入一个比None(default default-object) 更好的默认对象,它具有该get方法。那将是一本空字典{}

data = mail.get('data')
new_dict['parse']['from'] = data.get('from', {}).get('text')
Run Code Online (Sandbox Code Playgroud)

  • @swdon 如果没有看到你的翻译,我们就无法知道。我们所知道的是,`mail.get('data')` 返回的对象有时是一个字典(因为它有 `get` 方法,否则你必须执行 `mail.get('data', {} )`) 没有键 `'from'`。Python 不太可能(几乎不可能)正确地读取内存,而且更有可能的是,问题出在生成“mail”字典的管道中。 (2认同)