虽然标题可以理解为三个问题,但实际问题描述起来很简单。在 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 兼容?我想以正确的方式实现相等运算符,而不仅仅是抑制警告或类似的内容。
来自文档 http://docs.python.org/3.4/reference/datamodel.htmlPython 3.4 的页面:
如果一个类没有定义__eq__()
方法不应该定义一个__hash__()
操作任一;如果它定义了__eq__()
但不是__hash__()
,它的实例将不能用作可散列集合中的项目。如果一个类定义了可变对象并实现了__eq__()
方法,它不应该实现__hash__()
,因为可散列集合的实现要求键的散列值是不可变的(如果对象的散列值发生变化,它将位于错误的散列桶中)。
基本上,您需要定义一个__hash()__
功能。
问题是对于用户定义的类,__eq()__
and __hash()__
函数是自动定义的。
x.__hash__()
返回一个适当的值,使得x == y
暗示
两者都是x is y
and hash(x) == hash(y)
.
如果您只定义__eq()__
, then __hash()__
设置为返回None
。所以你会撞墙。
如果您不想费心实施,则更简单的方法__hash()__
并且您确定您的对象永远不会被散列,您只需明确声明__hash__ = None
它负责处理警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)