没有Python错误/错误?

时间:2013-06-19 18:18:38

标签: python python-2.7 python-3.x types

在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

4 个答案:

答案 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

  

Nonetypes.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。简短而具有描述性。