为什么int.__eq__在python2中似乎没有实现[重复]

问题描述 投票:2回答:1

.我的头比较抓狂,看来不只是我一个人,但是真的没有办法解决吗? 我觉得很难相信!

所以问题是为什么我不能打电话给... 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,但我希望能有更多的观点。

python python-2.7 comparison-operators magic-methods
1个回答
1
投票

一般的规则是:不要碰dunderscore方法,用函数和运算符来代替,这些会委托给dunderscore执行 根据需要. 在你的情况下,你要找的是 == 经营者 或功能等同物 operator.eq.

from operator import eq
from functools import partial

print eq(1, 2)

f = partial(eq, 1)
print f(2)
© www.soinside.com 2019 - 2024. All rights reserved.