【问题标题】:Other unique-instance objects besides None in python?python中除了None之外的其他唯一实例对象?
【发布时间】:2015-12-13 19:36:08
【问题描述】:

python 语言参考提到了三个具有单个唯一实例的对象:NoneNotImplementedEllipsis (section 3.2 "The Standard Type Hierarchy")。测试x is None 是一个常见的习惯用法,通过保证None 的唯一性成为可能。我在 python 文档或堆栈溢出中找不到任何其他提及唯一实例对象的内容。像this one 这样的一些问题对构建此类对象的方法提出了有趣的建议,但我想知道的是除了这三个内置函数之外是否还有其他我错过的。

例如,() 似乎是独一无二的(在 CPython 中公认的非常有限的测试中),那么测试 x is () 安全吗?或者这种情况下x == () 是强制性的吗?

【问题讨论】:

  • 测试x is () 是没有意义的,if x 会达到同样的效果。你为什么要问?
  • bool(x)False 的许多可能值。我需要检查x 是否实际上是(),而不是其他可能性之一,原因与您使用x is None 完全相同。
  • 如果 x 是一个元组,isinstance(x, tuple) 也会明确允许您检查 x 实际上是一个元组
  • 看到这一点并意识到我也可以返回 NotImplemented 而不是 None (并使用“is”测试它),当我想表示某些东西在 None 是不存在时,这很有帮助有效值(即从函数/方法请求的对象存在,但它的值可以是 None 与对象不存在)

标签: python built-in


【解决方案1】:

嗯...您可以将任何全局对象视为“唯一”,因为它始终是同一个对象。

例如:

>>> x = file
>>> x is file
True
>>> x = True
>>> x is True
True
>>> x = ZeroDivisionError
>>> x is ZeroDivisionError
True

没有什么特别的:

>>> x = None
>>> x is None
True

您可能想知道为什么应该测试x is None 而不是x == None

答案是:x == None 将调用 x.__eq__(None),这可能会在 x 实际上不是 None 的各种情况下返回 True(尽管实际上这并不常见)。

实例?

好吧,你可能会说有区别:None 是一个实例。

事实上,Python 中的一切都是对象,这意味着一切都是实例。在我的例子中,fileZeroDivisionErrortype 的实例,Truebool 的实例,NoneNoneType 的实例(注意typetype 的实例,因此该规则没有例外)。

None 有一个特别的地方——它是NoneType 的唯一实例,你不能制造其他人(除非有什么好办法?)

但这实际上是NoneType 的一个属性——它不允许你创建新实例:

TypeError: cannot create 'NoneType' instances

但这对于整个故事来说并不是真正重要的。

EDIT这些“唯一实例对象”被称为单例。当然,你可以自己做一些。

【讨论】:

    【解决方案2】:

    不,没有其他具有单一值的内置类型。这些单例的唯一关系是bool 类型,它允许两个值(即TrueFalse)*。

    Python 2.x 中(我在3.x 中找不到它们)您可以通过从types 模块导入NotImplementedType, EllipsisType, NoneType 来查看此限制,并意识到它显然不是花哨的自定义TypeError:

    In [13]: from types import NoneType
    
    In [14]: n = NoneType()
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-14-b386f51143fb> in <module>()
    ----> 1 n = NoneType()
    
    TypeError: cannot create 'NoneType' instances
    

    () 不幸的是不是唯一的,它代表一个空元组,如果 Tuple 类型是唯一的,因为NoneType 是唯一的,那么它的所有实例都需要具有相同的值强>.


    如果你想仔细看看这些,它们位于 Objects/object.c13511473 行> 分别为NoneNotImplemented。省略号尚未找到。


    *更新:显然,TrueFalse也是单例,根据 PEP 285 - Adding a bool type

    值 False 和 True 将是单例,例如 None。因为 该类型有两个值,也许应该调用这些值 “双胞胎”?真正的实现不会允许其他 要创建的 bool 实例

    【讨论】:

      【解决方案3】:

      值得一提的是,() 在 PyPy 4.0.1 中并不是唯一的:

      >>>> x = ()
      >>>> x is ()
      False
      

      【讨论】:

      • 他特别提到了CPython。
      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 2016-11-12
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多