为什么Python 3中的NotImplemented truthy?

Jul*_*ian 5 python boolean python-3.x truthiness

这个问题的答案和讨论刺激了这个问题.以下代码段显示了问题的关键:

>>> bool(NotImplemented)
True
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  1. 为什么决定bool价值NotImplemented应该是True?它感觉是unpythonic.
  2. 我没有意识到有充分的理由吗?文档似乎只是说,"因为它是".
  3. 有没有以合理的方式使用它的例子?

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

>>> class A:
...     def something(self):
...         return NotImplemented
...
>>> a = A()
>>> a.something()
NotImplemented
>>> if a.something():
...     print("this is unintuitive")
...
this is unintuitive
Run Code Online (Sandbox Code Playgroud)

具有如此负面含义(缺乏实施)的东西似乎是一种奇怪的行为.

相关文字来自:

未实现

这应该由二进制特殊的方法被返回(如特殊的值__eq__(),__lt__(),__add__(),__rsub__(),等等),以指示该操作不相对于另一种类型的实施; 可通过就地二进制特殊的方法(例如被返回__imul__(),__iand__()为了相同的目的,等等).它的真实价值是真实的.

- 来自Python Docs

编辑1

为了澄清我的立场,我觉得NotImplemented能够评估一个布尔值本身就是一种反模式.我觉得Exception更有意义,但流行的想法是在评估不同对象之间的比较时,出于性能原因选择常量单例.我想我正在寻找令人信服的理由,为什么这是选择的"方式".

che*_*ner 11

默认情况下,对象被视为truthy(bool(obj) == True),除非它的类提供了一种覆盖其真实性的方法.在的情况下NotImplemented,从来没有人提供了一个令人信服的用例为bool(NotImplemented)返回False,所以<class 'NotImplementedType'>从来没有提供覆盖.

  • 相关[文档](https://docs.python.org/3/library/stdtypes.html#truth-value-testing) (4认同)
  • @Julian:没有什么能够证明把它变成假的.您对它的使用是错误的(它仅用于二进制运算符重载,触发对正在操作的其他对象的委托,而不是用于指示尚未实现的方法).正确的代码将使用`raise NotImplementedError("msg")`来避免将结果静默地视为**truthy或falsy.IMO,唯一合理的改变是使`NotImplementedType .__ bool__`引发`TypeError`,这样人们就不会在布尔上下文中意外地误用它[Python习惯的方式](https://bugs.python.org/ issue21408). (4认同)