虽然标题可以解释为三个问题,但实际问题很容易描述.在Linux系统上我安装了python 2.7.3,并希望收到有关python 3不兼容性的警告.因此,我的代码片段(tester.py)看起来像:
#!/usr/bin/python -3
class MyClass(object):
def __eq__(self, other):
return False
当我执行此代码片段(被认为只是为了显示问题,而不是我在项目中使用的实际代码片段)时
./tester.py
我收到以下弃用警告:
./tester.py:3: DeprecationWarning: Overriding __eq__ blocks inheritance of __hash__ in 3.x
class MyClass(object):
我的问题:如何更改此代码段以消除警告,即使其与版本3兼容?我想以正确的方式实现相等运算符,而不仅仅是抑制警告或类似的东西.
解决方法:
从Python 3.4的documentation页面:
If a class does not define an
__eq__()
method it should not define a__hash__()
operation either; if it defines__eq__()
but not__hash__()
, its instances will not be usable as items in hashable collections. If a class defines mutable objects and implements an__eq__()
method, it should not implement__hash__()
, since the implementation of hashable collections requires that a key’s hash value is immutable (if the object’s hash value changes, it will be in the wrong hash bucket).
基本上,您需要定义__hash()__函数.
问题是对于用户定义的类,自动定义__eq()__和__hash()__函数.
x.__hash__()
returns an appropriate value such thatx == y
implies
both thatx is y
andhash(x) == hash(y)
.
如果仅定义__eq()__,则__hash()__设置为返回None.所以你会碰壁.
如果你不想打扰实现__hash()__并且你肯定知道你的对象永远不会被散列,那么更简单的方法是你只需要明确地声明__hash__ = None来处理警告.