20

在 Python 中,你有None单例,在某些情况下它的行为非常奇怪:

>>> a = None
>>> type(a)
<type 'NoneType'>
>>> isinstance(a,None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

所以首先,<type 'NoneType'>显示None不是类型,但NoneType就是这样。然而,当您运行时isinstance(a,NoneType),它会响应错误:NameError: name 'NoneType' is not defined

现在,鉴于此,如果您有一个输入默认设置为 的函数None,并且需要检查,您将执行以下操作:

if variable is None:
    #do something
else:
    #do something

我不能执行以下操作的原因是什么:

if isinstance(variable,None): #or NoneType
    #do something
else:
    #do something

我只是在寻找详细的解释,以便更好地理解这一点

编辑:好的应用程序

假设我想使用,以便在有多种类型时isinstance可以做某事,包括:variableNone

if isinstance(variable,(None,str,float)):
    #do something
4

4 回答 4

32

你可以试试:

>>> variable = None
>>> isinstance(variable,type(None))
True
>>> variable = True
>>> isinstance(variable,type(None))
False

isinstance需要 2 个参数isinstance(object, classinfo)在这里,通过传递None您设置classinfo为 None,因此错误。您需要传入类型。

于 2013-06-19T18:20:45.217 回答
24

None不是类型,它是单例实例本身 - 的第二个参数isinstance必须是它们的类型、类或元组。因此,您需要使用NoneTypefrom types

from types import NoneType
print isinstance(None, NoneType)
print isinstance(None, (NoneType, str, float))
真的
真的

虽然,我经常倾向于isinstance(x, (NoneType, str, float))x is None or isinstance(x, (str, float)).

于 2013-06-19T18:20:45.840 回答
4

None只是 的一个值types.NoneType,它不是一个类型。

错误很清楚:

TypeError: isinstance() arg 2 必须是类型类型的元组

文档

None是的唯一。经常用于表示没有值,例如没有将默认参数传递给函数时。types.NoneTypeNone

您可以使用types.NoneType

>>> from types import NoneType
>>> isinstance(None, NoneType)
True

is运算符也可以正常工作:

>>> a = None
>>> a is None
True
于 2013-06-19T18:20:02.933 回答
3

None是一个值(实例)而不是一个类型。如错误消息所示,isinstance期望第二个参数是一个类型。

None 的类型是type(None), 或者Nonetype如果你导入它 ( from types import NoneType)

注意:进行测试的惯用方法是variable is None. 简短且具有描述性。

于 2013-06-19T18:23:37.113 回答