我正在尝试将一些代码从 2 转换为 3 以及以下简单脚本
import types
from types import NoneType
结果是
ImportError:无法导入名称 NoneType
如何将上述从 2 转换为 3?
我正在尝试将一些代码从 2 转换为 3 以及以下简单脚本
import types
from types import NoneType
结果是
ImportError:无法导入名称 NoneType
如何将上述从 2 转换为 3?
模块中不再有NoneType
引用。types
您应该直接检查身份None
,即obj is None
. 如果您真的需要 , 另一种方法NoneType
是使用它:
NoneType = type(None)
types.NoneType
这实际上与之前定义的方式完全相同,在2007 年 11 月 28 日被删除之前。
作为旁注,您无需导入模块即可使用该from .. import
语法,因此import types
如果您不在其他任何地方使用模块引用,则可以放弃您的行。
如果您的用例允许,您可以:
if my_dict.get('key'): # By Default: returns None if key doesn't exists
# Do something
else:
# Do something with None
None 是一个虚假值,因此您可以在不导入任何内容的情况下使用 if-else 语句。
在执行验证时,获取NoneType
是有用的,可以缩写在None
可接受类型的元组中传递允许类型的条件链。所以不要写这样的东西:
a = {...}
is_valid = (
a.get(mandatory_field) is None
or isinstance(a[mandatory_field], str)
)
可以写:
is_valid = isinstance(a.get(mandatory_field), (str, NoneType))
可以通过将默认字符串值传递给来解决此问题.get(...)
(因为在没有该字段的情况下,您将返回有意通过验证的内容,即使该值不存在),但它太hacky,晦涩难懂并且确实影响可读性。
由于NoneType
不再是可以导入的东西,因此您可以在需要时制作自己的东西。这些是一些选项:
NoneType = type(None)
NoneType = None.__class__
如果您遵循 PEP8 建议,则 linter可能会抱怨调用的变量NoneType
不符合您的命名约定。我发现type(None)
在需要NoneType
. 这只是两个字符的区别,就像可读性一样,您可以节省一行代码;)
上面代码片段的最终解决方案如下所示:
is_valid = isinstance(a.get(mandatory_field), (str, type(None)))