python, Fix ошибки TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Описываю очень кратко, вдруг кому пригодится. Может быть в будущем сделаю нормальное и полное решение.
Задача:
Запустить библиотеку comtypes на python 3.3.
Проблема:
Текущая сборка comtypes 6.2 для win32-py3 работает только на python 3.1. На python старших версий выдаётся ошибка следующего вида:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python33\lib\site-packages\comtypes\__init__.py", line 1055, in <module>
class IUnknown(object, metaclass=_cominterface_meta):
File "C:\Python33\lib\site-packages\comtypes\__init__.py", line 286, in __new__
class _(partial.partial, POINTER(p)):
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Это значит, что не совпали наследственности обычных классов и мета классов.
Решение:
По сути, как решать эту проблему хорошо описано тут: http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/.
Если же на пальцах и без теории, то выглядит это так:
Был код:
class _(partial.partial, POINTER(p)):
А должен стать:
class _meta(type(partial.partial), type(POINTER(p))):
pass
class _(partial.partial, POINTER(p), metaclass=_meta):
Где _meta - требуемый метакласс, наследуемый от метаклассов родителей целевого класса (_).
Необходимо сделать подобные изменения кода везде, где интерпретатор валится. Не забывайте между попытками чистить comtypes.gen папочку.










