19

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

import types
from types import NoneType

结果是

ImportError:无法导入名称 NoneType

如何将上述从 2 转换为 3?

4

3 回答 3

33

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

NoneType = type(None)

types.NoneType这实际上与之前定义的方式完全相同,在2007 年 11 月 28 日被删除之前。

作为旁注,您无需导入模块即可使用该from .. import语法,因此import types如果您不在其他任何地方使用模块引用,则可以放弃您的行。

于 2013-04-05T22:36:47.817 回答
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 语句。

于 2021-10-31T10:02:40.717 回答
0

在执行验证时,获取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)))
于 2022-01-05T15:03:47.630 回答