Как перехватить и обработать исключения во время вычисления MRO при создании экземпляра недопустимого подкласса - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь создать класс Abstract Mixin для библиотеки Qt, над которой я работаю. Мой миксин будет работать только с подклассами QBoxLayout, но не с его родительским классом QLayout.

from abc import ABCMeta

# In Qt
class QLayout:
    ...

# In Qt
class QBoxLayout(QLayout):
    ...

class AbstractLayoutMixin(QBoxLayout, metaclass=ABCMeta):
    ...

class BrokenLayout(QLayout, AbstractLayoutMixin):
    ...

broken_layout = BrokenLayout()

Если разработчик наивно или случайно использует мой Mixin с QLayout вместо QBoxLayout, я хотел бы напечатать более описательную ошибку, чем

Traceback (most recent call last):
  File "/home/user/name.py", line 14, in <module>
    class BrokenLayout(QLayout, AbstractLayoutMixin):
  File "/home/user/.virtualenvs/bf/lib/python3.6/abc.py", line 133, in __new__
    cls = super().__new__(mcls, name, bases, namespace, **kwargs)
TypeError: Cannot create a consistent method resolution
order (MRO) for bases QLayout, AbstractLayoutMixin

Возможно ли лучше справиться с этим исключением? Моим первым инстинктом было попытаться определить AbstractLayoutMixin.__new__ и, возможно, сделать что-то там, но сначала вызывается ABCMeta.__new__ без его использования.

...