如何让Python对象在等式测试中总是返回真?

2 投票
2 回答
2406 浏览
提问于 2025-04-18 04:58

编辑:下面的代码有一个简单的错误,实际上没有展示出问题。我把它留在这里(没有修正),但我仍然对底部的问题的答案很感兴趣。

我在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

撰写回答