【发布时间】:2015-08-27 13:00:44
【问题描述】:
我想知道python 中有一个不等于运算符的原因。
以下截图:
class Foo:
def __eq__(self, other):
print('Equal called')
return True
def __ne__(self, other):
print('Not equal called')
return True
if __name__ == '__main__':
a = Foo()
print(a == 1)
print(a != 1)
print(not a == 1)
输出:
Equal called
True
Not equal called
True
Equal called
False
这是否真的会通过可能的说法引起很多麻烦:
A == B and A != B
可以同时正确。此外,这会在忘记实现 __ne__ 时引入潜在的陷阱。
【问题讨论】:
-
优化?这是违反合同的。
-
"比较运算符之间不存在隐含关系。
x==y为真并不意味着x!=y为假。因此,在定义__eq__()时,还应定义__ne__()以便操作员按预期行事。" -
@CoryKramer 它来自哪里?
-
这似乎符合 Python 的非正式“我们都是成年人”的政策。如果您想通过两个运算符的不一致行为来自取其辱,那么 Python 不会阻止您。 (我知道这并不能真正回答“为什么首先有两种不同的 dunder 方法?”的问题,但值得指出)
-
@magu_ 无论哪种方式,我都可以看到一个强有力的论据,但我认为他们的决定是 Python 应该允许 many-valued logic 所以只返回
True或False的要求不是强加
标签: python python-3.x operator-overloading