【问题标题】:None Python error/bug?无 Python 错误/错误?
【发布时间】:2013-06-16 09:56:24
【问题描述】:

在 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

首先,&lt;type 'NoneType'&gt; 显示 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,以便在variable 是多种类型(包括None)时可以做一些事情:

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

【问题讨论】:

  • if variable == None 是反惯用的 Python。执行此测试的标准方法是利用 None 是单例的事实:改用 if variable is None

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


【解决方案1】:

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

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))

【讨论】:

  • 很好的答案和解释,但我接受了 karthikr,因为它不需要导入
  • @RyanSaxe 没关系,我原谅你。但是,如果您打算大量使用NoneType,我只会从types 导入它。当您可以轻松访问该值时,似乎没有必要调用 type(None)
  • 类型中不再有 NoneType 引用。你可以使用NoneType = type(None)
  • 我喜欢这个答案,因为它规范了我的代码,而不是以不同的方式处理 None 的情况
【解决方案2】:

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

而且错误很清楚:

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

来自docs

Nonetypes.NoneType 的唯一None 常用来表示 没有值,例如没有将默认参数传递给 功能。

你可以使用types.NoneType

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

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

>>> a = None
>>> a is None
True

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      你可以试试:

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

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

      【讨论】:

        猜你喜欢
        • 2013-09-14
        • 2015-05-22
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多