如何让Python对象在等式测试中总是返回真?
编辑:下面的代码有一个简单的错误,实际上没有展示出问题。我把它留在这里(没有修正),但我仍然对底部的问题的答案很感兴趣。
我在Python中有一个对象,它应该在进行相等性测试时总是返回真:
class Wildcard(object):
def __eq__(self, other):
return True
在某些情况下它能正常工作,但并不是所有情况:
>>> w = Wildcard()
>>> w == 'g'
True
>>> 'g' == w
True
>>> w == 10
True
>>> 10 == 'w'
False
根据我的理解,== 操作符会把第二个操作数传递给第一个操作数的 __eq__ 方法,这就解释了为什么 w == 10 能工作,但 10 == w 却不行。这引出了两个问题。首先,是否有可能构造一个对象,使得无论哪个操作数,它都有这个特性?其次,为什么在字符串上这样做有效,但在整数上却不行?字符串的 __eq__ 方法有什么特别之处,使得 'g' == w 的结果为真?
2 个回答
8
这段内容是关于编程问题的讨论,主要涉及一些技术细节和解决方案。虽然具体的问题没有给出,但可以想象这是一个程序员在寻求帮助的场景。大家在这里分享自己的经验和建议,试图找到最佳的解决办法。
在编程中,遇到问题是很常见的,很多时候我们需要向其他人请教,或者在网上查找资料。这个过程就像是一个学习的机会,大家通过交流,互相帮助,提升自己的技能。
如果你是刚开始学习编程的小白,记住,遇到问题不要气馁,积极寻求帮助是进步的好方法。多看看别人是怎么解决问题的,慢慢你也会变得越来越熟练。
from unittest.mock import ANY
assert ANY == 2
assert 2 == ANY
assert (4, 2) == (ANY, 2)
assert "abc" == ANY
assert ANY == "abc"
assert ANY == False
assert ANY == True
assert ANY == None
assert ANY
11
很遗憾,我不知道有什么方法可以构造这样的对象。想想看:
>>> class Wildcard(object):
... def __eq__(self, other):
... return True
...
>>> w = Wildcard()
>>> w == 10
True
>>> 10 == w
True
>>> class Joker(object):
... def __eq__(self, other):
... return False
...
>>> j = Joker()
>>> w == j
True
>>> j == w
False
在这种情况下,w
(一个通配符)没有理由比j
(一个小丑)更优先。
现在,你可能会好奇为什么这在字符串和整数上有效——这是因为如果类的测试返回的是单例NotImplemented
,那么测试就会从第一个参数转交给第二个参数:
>>> class Foo(object):
... def __eq__(self, other):
... if isinstance(other, Wildcard):
... return NotImplemented
... else:
... return False
...
>>> f = Foo()
>>>
>>> f == 1
False
>>> f == Foo()
False
>>> f == w
True