在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
是。{1}}。但是,当您运行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
,以便variable
有多种类型,包括None
,我可以做点什么:
if isinstance(variable,(None,str,float)):
#do something
答案 0 :(得分:30)
您可以尝试:
>>> variable = None
>>> isinstance(variable,type(None))
True
>>> variable = True
>>> isinstance(variable,type(None))
False
isinstance需要2个参数isinstance(object, classinfo)
这里,通过传递None
,您将classinfo
设置为无,因此错误。你需要传递类型。
答案 1 :(得分:23)
None
不是一个类型,它是单例实例本身 - 而isinstance
的第二个参数必须是它们的类型,类或元组。因此,您需要使用types
中的NoneType
。
from types import NoneType
print isinstance(None, NoneType)
print isinstance(None, (NoneType, str, float))
True True
虽然,我常常倾向于用isinstance(x, (NoneType, str, float))
替换x is None or isinstance(x, (str, float))
。
答案 2 :(得分:4)
None
只是types.NoneType
的值,它不是类型。
错误很明显:
TypeError:isinstance()arg 2必须是类,类型或元组 类和类型
来自docs:
None
是types.NoneType
的唯一值。None
经常被用来代表 没有值,因为默认参数没有传递给a 功能
您可以使用types.NoneType
>>> from types import NoneType
>>> isinstance(None, NoneType)
True
is
运算符也可正常运行:
>>> a = None
>>> a is None
True
答案 3 :(得分:3)
None
是一个值(实例),而不是一个类型。如错误消息所示,isinstance
期望第二个参数是一个类型。
无类型为type(None)
,如果您导入Nonetype
,则为from types import NoneType
注意:进行测试的惯用方法是variable is None
。简短而具有描述性。