我最近发现python有一个特殊值NotImpemented用于二进制特殊方法,以指示某些操作尚未实现。
这方面的特殊之处在于,在二元情境中检查时,它总是等同于True
。
例如,对于比较中的两个对象,使用io.BytesIO
(例如,未实现__eq__
的情况)将实际返回True
。正如此example(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
更适合各种reasons所以我不会要求对此事的原因作出任何解释。
答案 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
函数。