Почему подклассы 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, при условии, что они импортируются где-то после объявления класса.

Почему это может быть?

0 ответов

Другие вопросы по тегам