为什么我在 Python 中收到错误消息“无法导入名称 NoneType”?

问题描述 投票:0回答:4

我正在尝试将一些代码从 2 转换为 3 以及以下简单脚本

import types
from types import NoneType

结果

导入错误:无法导入名称 NoneType

如何将上面的 2 转换为 3?

python python-3.x importerror porting
4个回答
49
投票

NoneType
模块中不再有
types
参考。您应该直接使用
None
检查身份,即
obj is None
。如果您确实需要
NoneType
,另一种方法是使用:

NoneType = type(None)

这实际上与之前定义

types.NoneType
的方式完全相同,但在 2007 年 11 月 28 日被删除之前

顺便说一句,您不需要导入模块即可使用

from .. import

 语法,因此如果您不在其他地方使用模块引用,则可以删除 
import types
 行。


2
投票
在执行验证时获取

NoneType

 非常有用,可以缩短在可接受类型元组中传递允许的 
None
 类型的条件链。所以不要写这样的东西:

a = { # A dict with some fields... } # In this example, the optional field is valid if it is a string is_valid = ( a.get(optional_field) is None or isinstance(a[optional_field], str) )
可以写:

is_valid = isinstance(a.get(optional_field), (str, NoneType))
可以通过将默认字符串值传递给 

.get(...)

 来解决此问题(因为在缺少该字段的情况下,您将返回有意通过验证的内容,即使该值不存在),但它是太老套、晦涩,确实影响可读性。

由于

NoneType

 不再可以导入,因此您可以在需要时自己制作。这些是一些选项:

NoneType = type(None) NoneType = None.__class__
如果您遵循 PEP8 建议,linter 可能会抱怨名为 
NoneType

的变量不符合您的命名约定。我发现只要需要

type(None)
,就使用
NoneType
会更容易。只有两个字符的差异,同样可读,并且您可以节省一行代码;)
上面代码片段的最终解决方案如下所示:

is_valid = isinstance(a.get(optional_field), (str, type(None)))



0
投票

if my_dict.get('key'): # By Default: returns None if key doesn't exists # Do something else: # Do something with None

None 是一个虚假值,因此您可以使用 if-else 语句而不导入任何内容。

出于一般一致性和静态检查原因,

0
投票
NoneType

已于

2020 年 9 月 21 日
与其他类型一起恢复,在 Python 3.10.0 中有效。

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