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

新手上路,请多包涵

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

import types
from types import NoneType

结果是

ImportError:无法导入名称 NoneType

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

原文由 deltanovember 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

 NoneType = type(None)

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

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

原文由 poke 发布,翻译遵循 CC BY-SA 3.0 许可协议

获取 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(...) 来解决此问题(因为在没有该字段的情况下,您将返回有意通过验证的内容,即使该值不存在) , 但它太 hacky,晦涩难懂,确实影响可读性。

由于 NoneType 不再是您可以导入的东西,您可以在需要时制作自己的东西。这些是一些选项:

 NoneType = type(None)
NoneType = None.__class__

如果您遵循 PEP8 建议,linter 可能会抱怨名为 NoneType 的变量不符合您的命名约定。我发现只要在需要 NoneType 的地方使用 type(None) 就更容易了。它只有两个字符的区别,就像可读性一样,你节省了一行代码;)

上面代码片段的最终解决方案如下所示:

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

原文由 Victor Schröder 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题