.我的头比较抓狂,看来不只是我一个人,但是真的没有办法解决吗? 我觉得很难相信!
所以问题是为什么我不能打电话给... int.__eq__
有2个运算符或 i.__eq__
用一个? 如何使用 __eq__
(以及其他比较运算符),对一个ints序列进行逐项比较?
这是python2.7.17的dump。
>>> i = 0
>>> type(i)
<type 'int'>
>>> i.__eq__(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__eq__'
>>> type(i).__eq__(i, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected 1 arguments, got 2
>>> type(i).__eq__(0)
NotImplemented
但我的python3.6.9中的dumo却能自己运行。
>>> i = 0
>>> type(i)
<class 'int'>
>>> i.__eq__(0)
True
>>> type(i).__eq__(i, 0)
True
>>> type(i).__eq__(0) # this is not expected to work, but just for the sake of voodoo.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected 1 arguments, got 0
我知道python2已经不支持了,但是有一些应用程序只使用python2,我想让我的代码向后兼容。
我相信一定有什么办法可以解决。
好像有一些这方面的资料。我刚刚读到,python2在某些情况下会恢复使用cmp,而在python3中则没有cmp(我读到的)。所以我想应该做的是不使用eq和ne,而是使用cmp,但我希望能有更多的观点。
一般的规则是:不要碰dunderscore方法,用函数和运算符来代替,这些会委托给dunderscore执行 根据需要. 在你的情况下,你要找的是 ==
经营者 或功能等同物 operator.eq
.
from operator import eq
from functools import partial
print eq(1, 2)
f = partial(eq, 1)
print f(2)