我正在尝试将一些代码从 2 转换为 3 以及以下简单脚本
import types
from types import NoneType
结果
导入错误:无法导入名称 NoneType
如何将上面的 2 转换为 3?
NoneType
模块中不再有 types
参考。您应该直接使用 None
检查身份,即 obj is None
。如果您确实需要 NoneType
,另一种方法是使用:
NoneType = type(None)
这实际上与之前定义
types.NoneType
的方式完全相同,但在 2007 年 11 月 28 日被删除之前。
顺便说一句,您不需要导入模块即可使用 from .. import
语法,因此如果您不在其他地方使用模块引用,则可以删除
import types
行。
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)))
if my_dict.get('key'): # By Default: returns None if key doesn't exists
# Do something
else:
# Do something with None
None 是一个虚假值,因此您可以使用 if-else 语句而不导入任何内容。
出于一般一致性和静态检查原因,