这个问题是由this question的答案和讨论引起的。以下代码片段显示了问题的症结所在:
>>> bool(NotImplemented)
True
我的问题如下:
bool
的{{1}}值设为NotImplemented
?感觉很不可思议。为什么我认为它不直观(请忽略缺乏最佳实践的原因)的原因:
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
为澄清我的立场,我觉得__iand__()
能够评估为布尔值本身就是一种反模式。我觉得“异常”更有意义,但普遍的想法是,在评估不同对象之间的比较时,出于性能原因选择了常量单例。我想我正在寻找令人信服的理由,说明为什么这就是选择的“方式”。
答案 0 :(得分:10)
默认情况下,除非对象的类提供了重写其真实性的方法,否则该对象被视为真实(bool(obj) == True
)。在NotImplemented
的情况下,没有人为bool(NotImplemented)
提供令人信服的用例来返回False
,因此<class 'NotImplementedType'>
从未提供覆盖。
答案 1 :(得分:3)
正如accepted answer所解释的那样,除非python中所有类都通过Truth Value Testing进行了特殊更改,否则所有类都被认为是真理(bool(obj) returns True
)。在某些情况下,应将其覆盖,例如空列表,0
或False
(请参见良好的列表here)。
但是,NotImplemented
没有任何令人信服的理由是虚假的。这是解释器使用的特殊值,只能由特殊方法返回,并且不能到达常规的python代码。
应该由二进制特殊方法(例如
__eq__()
,__lt__()
,__add__()
,__rsub__()
等)返回的特殊值,以指示该操作不是相对于另一种类型实现。错误返回
NotImplemented
将导致产生误导性错误消息,或者将NotImplemented
值返回给Python代码。
解释器使用它来选择方法,或以其他方式影响行为,例如comparison operator ==
或bool()
本身(首先检查__bool__
之后,如果返回NotImplemented
,__len__
)。
请注意,存在NotImplementedError
异常,大概是因为它实际上是未实施操作的错误。在您的特定示例中,something
中的class A
应该会引发此异常。