为什么Python 3中没有实现真理?

时间:2019-01-10 17:59:37

标签: python python-3.x boolean truthiness

这个问题是由this question的答案和讨论引起的。以下代码片段显示了问题的症结所在:

>>> bool(NotImplemented)
True

我的问题如下:

  1. 为什么决定将bool的{​​{1}}值设为NotImplemented?感觉很不可思议。
  2. 我不知道有充分的理由吗?该文档似乎只是说“因为它是”。
  3. 有没有以合理方式使用它的示例?

为什么我认为它不直观(请忽略缺乏最佳实践的原因)的原因:

True

带有负面含义(缺乏实现)的东西被认为是真实的,这似乎很奇怪。

相关文本来自:

  

未实施

     

应该由二进制特殊方法(例如>>> class A: ... def something(self): ... return NotImplemented ... >>> a = A() >>> a.something() NotImplemented >>> if a.something(): ... print("this is unintuitive") ... this is unintuitive __eq__()__lt__()__add__()等)返回的特殊值,以指示该操作不是关于另一种类型实施;出于同一目的,可以通过就地二进制特殊方法(例如__rsub__()__imul__()等)返回。它的真值是真的。

     

-来自Python Docs

编辑1

为澄清我的立场,我觉得__iand__()能够评估为布尔值本身就是一种反模式。我觉得“异常”更有意义,但普遍的想法是,在评估不同对象之间的比较时,出于性能原因选择了常量单例。我想我正在寻找令人信服的理由,说明为什么这就是选择的“方式”。

2 个答案:

答案 0 :(得分:10)

默认情况下,除非对象的类提供了重写其真实性的方法,否则该对象被视为真实(bool(obj) == True)。在NotImplemented的情况下,没有人为bool(NotImplemented)提供令人信服的用例来返回False,因此<class 'NotImplementedType'>从未提供覆盖。

答案 1 :(得分:3)

正如accepted answer所解释的那样,除非python中所有类都通过Truth Value Testing进行了特殊更改,否则所有类都被认为是真理(bool(obj) returns True)。在某些情况下,应将其覆盖,例如空列表,0False(请参见良好的列表here)。

但是,NotImplemented没有任何令人信服的理由是虚假的。这是解释器使用的特殊值,只能由特殊方法返回,并且不能到达常规的python代码。

  

应该由二进制特殊方法(例如__eq__()__lt__()__add__()__rsub__()等)返回的特殊值,以指示该操作不是相对于另一种类型实现。

     

错误返回NotImplemented将导致产生误导性错误消息,或者将NotImplemented值返回给Python代码。

解释器使用它来选择方法,或以其他方式影响行为,例如comparison operator ==bool()本身(首先检查__bool__之后,如果返回NotImplemented__len__)。

请注意,存在NotImplementedError异常,大概是因为它实际上是未实施操作的错误。在您的特定示例中,something中的class A应该会引发此异常。