【问题标题】:Migrating from Python 2.7 to 3.7 - difference between isinstance(obj, None) vs is None从 Python 2.7 迁移到 3.7 - isinstance(obj, None) 与 is None 之间的区别
【发布时间】:2022-07-04 18:27:49
【问题描述】:

我必须将项目从 Python 2.7 迁移到 3.7。

这行代码曾经在 2.7 中工作

if isinstance(obj, None):

由于某种原因它不再。如果我这样修改:

if isinstance(obj, type(None)):

它会起作用的。

但我的问题是,这个调用有什么区别:

isinstance(obj, None)

obj is None

为什么最初的开发者决定使用 isinstance over is? (在 py 2.7 中)

谢谢。

【问题讨论】:

  • 在这两个版本中,检查None 的首选方法是obj is None。我无法告诉你为什么开发人员会进行如此复杂的比较。
  • 我有点惊讶if isinstance(obj, None): 曾经工作过; None 不是 None 的实例(None 不是类,没有任何东西是它的实例)。
  • 它在 Python 2.7.16 中肯定行不通。
  • 文档中没有任何内容暗示 None 被默默地提升为 type(None)(类似于类型提示中允许的内容)。
  • @chepner:在那种情况下,我对 OP 看到它在哪里工作感到困惑。

标签: python


【解决方案1】:

is 运算符用于检查两个对象是否相同,而isinstance 用于检查第二个参数是否出现在第一个参数的继承链中的任何位置。

obj is None

obj 实际上是None

isinstance(obj, type(None))

检查obj 是无类型对象。

但实际上只有一个 None 类型的对象。 None 是 None 类型的唯一对象。所以当你指定 None 类型时,你写成type(None)

毕竟isinstance(None, type(None)) 是真的。

【讨论】:

  • 在 Python 3.10 中,他们添加了一个 types.NoneType,它也可以与 isinstance() 一起使用。
  • @martineau:请注意,他们制作 types.NoneType 的方式与您在 3.10 之前的制作方式相同,with NoneType = type(None)。实际需要访问NoneType 是非常不寻常的,并且如果你真的需要它很容易生成,这就是为什么他们不费心直接公开它这么长时间(我猜他们添加它基本上是为了与他们暴露了其他单例的类型,主要用于类型提示,即使 None 是特殊情况下不需要 NoneType 进行类型提示)。
猜你喜欢
  • 2013-09-06
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2018-11-29
  • 2011-02-12
  • 2016-12-21
  • 2017-01-11
相关资源
最近更新 更多