首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在Python中收到一条错误消息:“无法导入名称NoneType”?

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

Stack Overflow用户
提问于 2013-04-05 22:34:21
回答 3查看 19.1K关注 0票数 27

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

代码语言:javascript
复制
import types
from types import NoneType

结果在

ImportError:无法导入名称NoneType

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-05 22:36:47

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

代码语言:javascript
复制
NoneType = type(None)

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

顺便提一句,您不需要导入模块才能使用from .. import语法,因此如果不在其他地方使用模块引用,则可以删除import types行。

票数 42
EN

Stack Overflow用户

发布于 2022-01-05 15:03:47

在执行验证时,获取NoneType是很有用的,这是在可接受类型的元组中简化传递允许的None类型的条件链。所以,不要写这样的东西:

代码语言:javascript
复制
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)
)

人们可以写:

代码语言:javascript
复制
is_valid = isinstance(a.get(optional_field), (str, NoneType))

可以通过将默认字符串值传递给.get(...)来解决此问题(因为在没有字段的情况下,您将返回一些有意通过验证的内容,即使该值不存在),但它太烦琐、晦涩,并真正影响可读性。

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

代码语言:javascript
复制
NoneType = type(None)
NoneType = None.__class__

如果您遵循NoneType建议,linter可能会抱怨一个名为PEP8的变量不符合您的命名约定。我发现在需要type(None)的地方简单地使用NoneType就更容易了。它只是两个字符之间的差异,就像可读的一样,并且保存了一行代码;)

以上片段的最终解决方案如下所示:

代码语言:javascript
复制
is_valid = isinstance(a.get(optional_field), (str, type(None)))
票数 2
EN

Stack Overflow用户

发布于 2021-10-31 10:02:40

如果用例允许,则可以:

代码语言:javascript
复制
if my_dict.get('key'):  # By Default: returns None if key doesn't exists
    # Do something
else:
    # Do something with None

没有一个是虚假的值,所以您可以在不导入任何内容的情况下使用if- get语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15844714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档