Почему подклассы ABCMeta и collection.Mapping нарушают isinstance(..., collection.Mapping)?
В python 3.5.2, 3.5.3, 3.6.3 (возможно, другие, не проверенные) код:
from abc import ABCMeta
import collections
class ProblematicClass(ABCMeta, collections.Mapping):
pass
isinstance(1, collections.Mapping)
вызывает ошибку:
File "recreate_problem.py", line 29, in <module>
isinstance(collections.Mapping, collections.Mapping)
File "......Python-3.5.2/Lib/abc.py", line 191, in __instancecheck__
return cls.__subclasscheck__(subclass)
File ".../Python-3.5.2/Lib/abc.py", line 226, in __subclasscheck__
if issubclass(subclass, scls):
File ".../Python-3.5.2/Lib/abc.py", line 225, in __subclasscheck__
for scls in cls.__subclasses__():
TypeError: descriptor '__subclasses__' of 'type' object needs an argument
То же самое происходит для любого
isinstance(thing, collections.Mapping)
где вещь не является экземпляром коллекций. Отображение (где isinstance будет возвращать false). Например
isinstance({}, collections.Mapping)
работает как обычно.
это также нарушает работу многих библиотек, вызывающих isinstance(..., collection.Mapping), например, pyplot и pandas, при условии, что они импортируются где-то после объявления класса.
Почему это может быть?