[issue41416] Restore default implementation of __ne__ in mixins Set and Mapping

Serhiy Storchaka report at bugs.python.org
Tue Jul 28 02:34:53 EDT 2020


New submission from Serhiy Storchaka <storchaka+cpython at gmail.com>:

According to the documentation [1] abstract classes collections.abc.Set and collections.abc.Mapping provide mixin method __ne__. But implementations of __ne__ in these classes were removed in 3.4 (see issue21408), so the default implementation is inherited from object. The reason is that it works better with classes which override __ne__ to return non-boolean, e.g. NumPy, SymPy and sqlalchemy classes. Previously the != operator falled back to other__eq__(), now it falls back to other__ne__().

[1] https://docs.python.org/3/library/collections.abc.html#collections-abstract-base-classes

But now we have a discrepancy between the decomentation and the code. According to the documentation, if we have a class which inherits from both Set and int, in that order, the __ne__ method should be inherited from class Set instead of class int. But currently it is inherited from int.

>>> import collections.abc
>>> class A(collections.abc.Set, int): pass
... 
>>> A.__ne__
<slot wrapper '__ne__' of 'int' objects>

One way to solve this -- remove __ne__ from lists of mixin methods (see issue41400). Other way -- add the __ne__ implementations which are identical to the default implementation but has preference in the inheritance. I prefer the latter.

----------
components: Library (Lib)
messages: 374470
nosy: rhettinger, serhiy.storchaka
priority: normal
severity: normal
status: open
title: Restore default implementation of __ne__ in mixins Set and Mapping
type: behavior
versions: Python 3.10

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue41416>
_______________________________________


More information about the Python-bugs-list mailing list