如何消除相等运算符的python3弃用警告?

Ale*_*lex 5 python deprecated python-2.7

虽然标题可以解释为三个问题,但实际问题很容易描述.在Linux系统上我安装了python 2.7.3,并希望收到有关python 3不兼容性的警告.因此,我的代码片段(tester.py)看起来像:

#!/usr/bin/python -3

class MyClass(object):    
    def __eq__(self, other):
        return False
Run Code Online (Sandbox Code Playgroud)

当我执行此代码片段(被认为只是为了显示问题,而不是我在项目中使用的实际代码片段)时

./tester.py
Run Code Online (Sandbox Code Playgroud)

我收到以下弃用警告:

./tester.py:3: DeprecationWarning: Overriding __eq__ blocks inheritance of __hash__ in 3.x
  class MyClass(object):
Run Code Online (Sandbox Code Playgroud)

我的问题:如何更改此代码段以消除警告,即使其与版本3兼容?我想以正确的方式实现相等运算符,而不仅仅是抑制警告或类似的东西.

Sud*_*jee 5

从Python 3.4 的文档页面:

如果一个类没有定义一个__eq__()方法,它也不应该定义一个__hash__()操作; 如果定义__eq__()但不定义__hash__(),则其实例将不能用作可散列集合中的项目.如果一个类定义了可变对象并实现了一个__eq__()方法,那么它就不应该实现__hash__(),因为hashable集合的实现要求一个键的哈希值是不可变的(如果对象的哈希值改变,它将在错误的哈希桶中).

基本上,您需要定义一个__hash()__函数.

问题是对于用户定义的类,自动定义__eq()____hash()__函数.

x.__hash__()返回一个适当的值,这x == y意味着x is yhash(x) == hash(y).

如果只定义了__eq()__,则__hash()__设置为return None.所以你会碰壁.

如果你不想打扰实现它__hash()__并且你肯定知道你的对象永远不会被散列,那么更简单的方法就是明确地声明__hash__ = None哪个会处理警告.