最近,我发现python有一个特殊的值NotImpemented,用于二进制特殊方法,表明某些操作尚未实现。
这方面的特别之处在于,当在二进制情况下签入时,它总是等价于True
。
例如,对两个对象使用io.BytesIO
(例如,__eq__
没有实现)将实际上返回True
。在这个示例中(encoded_jpg_io1
和encoded_jpg_io2
是io.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__
会导致同样的问题,因此我们回到第一步。
因此,检查这些情况的唯一方法是在相反的情况下与True
或False
进行精确的比较。
我知道NotImpemented
比NotImplementedError
更适合于各种原因,所以我不要求对此做出任何解释。
发布于 2018-03-28 04:26:12
默认情况下,对象被视为真,除非它的类定义返回
False
的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
函数。
https://stackoverflow.com/questions/49534037
复制