Python 3.x 中的 NoneType 在哪里?

Posted

技术标签:

【中文标题】Python 3.x 中的 NoneType 在哪里?【英文标题】:Where is the NoneType located in Python 3.x? 【发布时间】:2014-03-09 12:28:34 【问题描述】:

在 Python 3 中,我想检查 value 是字符串还是 None

一种方法是

assert type(value) in  str, NoneType 

但是NoneType 在 Python 中的位置在哪里?

没有任何导入,使用NoneType 会产生NameError: name 'NoneType' is not defined

【问题讨论】:

你也应该使用isinstance。它可能需要一个类型的元组来检查。 isinstance(value, (str, type(None))) 如果这不是用于单元测试,人们可能会争辩说您通常根本不应该键入 check。 @rmartinjak:一些程序员仍然喜欢用assert 语句来验证他们的编码假设。支持就在那里。 不会使用断言,也会使用单元测试,但如果你使用assert 无论如何.. 对不起,如果我的问题放错了,我知道isinstance(object, class-or-type-or-tuple),我只是想关注NoneType的位置问题。 【参考方案1】:

你可以使用type(None)来获取类型对象,但是你要在这里使用isinstance(),而不是type() in ...

assert isinstance(value, (str, type(None)))

NoneType 对象不会以其他方式暴露在任何地方。

我根本不会使用类型检查,我会使用:

assert value is None or isinstance(value, str)

None 是一个单例(非常有目的),NoneType 明确禁止子类化:

>>> type(None)() is None
True
>>> class NoneSubclass(type(None)):
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: type 'NoneType' is not an acceptable base type

【讨论】:

我知道这一点,但只是出于好奇,这是获得NoneType 的唯一方法吗? types.NoneType 不是来自 types 模块,就像在 2.X 中那样吗? @SilasRay:不,没有。它已从模块中删除,因为无论如何它只是一个简单的NoneType = type(None),相当没有意义。 @MartijnPieters 不过,最好将这一行放入 typing,这样我就不必在每个源文件中声明 NoneType = type(None) 对我来说这很奇怪。因为type(1) 我们得到了inttype(None) 我们得到了NoneType。我们可以只使用int 作为字典的键,但我们必须使用type(None) 作为字典的键。太奇怪了。【参考方案2】:

请使用type(None)。您可以使用 python shell 来检查下面的函数,我使用type(None)None 更改为NoneType

def to_unicode(value):
'''change value to unicode'''
try:
    if isinstance(value, (str,type(None))):
        return value
    if not isinstance(value, bytes):
        raise TypeError("Expected bytes, unicode, or None; got %r" % type(value))
    return value.decode("utf-8")
except UnicodeDecodeError:
    return repr(value)

【讨论】:

【参考方案3】:

types.NoneType 在 Python 3.10 中重新引入。

What’s New In Python 3.10

改进的模块

types

重新引入了types.EllipsisTypetypes.NoneTypetypes.NotImplementedType 类,提供了一组易于由类型检查器解释的新类型。 (由 Bas van Beek 在bpo-41810 提供。)

有关更改的讨论是出于对types.EllipsisType 的需求,导致types.NoneType 也成为added for consistency。

【讨论】:

以上是关于Python 3.x 中的 NoneType 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Python中的Nonetype类型判断

使用If条件时Python中的NoneType错误

试图在 PYSPARK 中的 Nonetype 属性(null)上跳过 python UDF

从列表中删除 NoneType 元素的本机 Python 函数?

TypeError:“NoneType”对象在 Python 中不可迭代

Python:Concurrent.Futures 错误 [TypeError:'NoneType' 对象不可调用]