NotImpemented的行为比较

时间:2018-03-28 12:02:38

标签: python

我最近发现python有一个特殊值NotImpemented用于二进制特殊方法,以指示某些操作尚未实现。

这方面的特殊之处在于,在二元情境中检查时,它总是等同于True

例如,对于比较中的两个对象,使用io.BytesIO(例如,未实现__eq__的情况)将实际返回True。正如此exampleencoded_jpg_io1encoded_jpg_io2io.BytesIO类的对象):

if encoded_jpg_io1.__ne__(encoded_jpg_io2):
    print('Equal')
else:
    print('Unequal')
  

等于

if encoded_jpg_io1.__eq__(encoded_jpg_io2) == True:
    print('Equal')
else:
    print('Unequal')
  

不等

由于第二种风格有点过于冗长而且通常不受欢迎(即使我的pyCharm建议删除与True的显式比较)是不是有点棘手的行为?如果我没有明确地打印布尔操作的结果(在这种情况下根本不是布尔值),我就不会注意到它。

我想建议考虑False会导致__ne__出现同样的问题,所以我们回到第一步。

因此,检查这些案例的唯一方法是在相反的情况下与TrueFalse进行精确比较。

我知道NotImpementedNotImplementedError更适合各种reasons所以我不会要求对此事的原因作出任何解释。

1 个答案:

答案 0 :(得分:2)

按照惯例,没有定义__bool__ method的对象被认为是真实的。来自the docs

  

默认情况下,对象被视为true,除非其类定义返回__bool__()的{​​{1}}方法或返回零的False方法

这意味着大多数类,函数和其他内置单例都被认为是真实的,因为它们不会自行指出不同的行为。 (例外是__len__(),这是 特别指示它应该被视为假的少数内置单例之一):

None

>>> bool(int) # the class, not an integer object True >>> bool(min) True >>> bool(object()) True >>> bool(...) # that's the Ellipsis object True >>> bool(NotImplemented) True 对象没有理由破坏这个约定。您的代码问题不在于NotImplemented被认为是真实的;真正的问题是NotImplemented不等同于x.__eq__(y)

如果要比较两个对象是否相等,则使用x == y执行此操作是不正确的。改为使用x.__eq__(y)仍然不正确。

正确的解决方案是与x.__eq__(y) == True运算符进行比较。如果由于某种原因,您无法直接使用==运算符,则应使用operator.eq函数。