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)
我们得到了int
,type(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.EllipsisType
、types.NoneType
和types.NotImplementedType
类,提供了一组易于由类型检查器解释的新类型。 (由 Bas van Beek 在bpo-41810 提供。)
有关更改的讨论是出于对types.EllipsisType
的需求,导致types.NoneType
也成为added for consistency。
【讨论】:
以上是关于Python 3.x 中的 NoneType 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
试图在 PYSPARK 中的 Nonetype 属性(null)上跳过 python UDF
从列表中删除 NoneType 元素的本机 Python 函数?