在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)
where事物不是collections.Mapping的实例(其中isinstance将返回false)。例如
isinstance({}, collections.Mapping)
照常工作。
这也会破坏许多调用isinstance(...,collections.Mapping)的库,例如pyplot和pandas,前提是它们在声明该类后在其他位置导入。
为什么会这样?