Issue 28263: Python 2.7's -3 flag warns about eq being implemented without hash even if hash is never accessed. (original) (raw)

Issue28263

Created on 2016-09-23 23:23 by Roy Williams, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg277305 - (view) Author: Roy Williams (Roy Williams) * Date: 2016-09-23 23:23
I'm finding the -3 flag to be super useful at identifying problems with code when porting to Python 3. One of the most common failures, however, is "DeprecationWarning: Overriding __eq__ blocks inheritance of __hash__ in 3.x". While implementing __eq__ without implementing __hash__ is very much an anti-pattern, this warning would be much less noisy if it could be thrown at time of access (like the __getslice__ warning) instead of time of declaration. See Also: https://github.com/nedbat/coveragepy/pull/17 http://bugs.python.org/issue28260
msg277309 - (view) Author: Antti Haapala (ztane) * Date: 2016-09-24 07:01
I am very negative to this idea. Correct code in Python **2** would either set `__hash__ = None` or redefine `__hash__` in *any* class that defines `__eq__`. That it just wasn't used like that is no excuse. This warning is even more important if even Ned Batchelder could have a bug like that in his code. It will break as soon as someone "realizes" that "hey I can use a set to remove duplicates in my container".
msg277317 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2016-09-24 12:58
Antti is correct. Please add __hash__ = None to your class to silence the warning.
History
Date User Action Args
2022-04-11 14:58:37 admin set github: 72450
2016-09-24 12:58:40 christian.heimes set status: open -> closednosy: + christian.heimesmessages: + resolution: not a bugstage: resolved
2016-09-24 11:16:31 nedbat set nosy: + nedbat
2016-09-24 07:01:09 ztane set nosy: + ztanemessages: +
2016-09-23 23:23:01 Roy Williams create