классами (в сети кстати овер дохера страданий на эту тему - не я первый), но у меня тут еще интереснее загон появился...
В общем мне надо абстрагировать поведение моделей алхимии от самих моделей, так как сервис в будущем может сменить систему хранения с бд на что-то другое (на что - пока не известно).
Сделал примерно так:
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class StorageModel(ABC):
...
class DBModel(Base, StorageModel):
__tablename__ = ...
fields = ...
При импорте этого объекта получаю ошибку конфликта метаклассов (очевидно, некая разновидность "проблемы ромба").
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Все, что читаю по этой ошибке - просто какой-то ебаный сюрриализм. Может кто-то внятно объяснить, как разруливать такой тип конфликтов, когда один из классов - генерируемый на лету? А если надо наследоваться от абстрактного класса и обычного? Ничего вменяемого не нагугливаю, одни демонстрации на спичках не покрывающие интересующий меня случай.
Если логически рассуждать, то мне при множественном наследовании метакласс абстракции нахуй не нужен (судя по доке, там находится ABCMeta для констрнуирования абстрактных классов) и им можно принебречь, явно указав метакласс базы алхимии
class DBModel(Base, StorageModel):
__metaclass__ = Base.__metaclass__ # или так __metaclass__ = DeclarativeMeta
__tablename__ = ...
fields = ...
Вот только такой вариант тоже нихера не помогает и ошибка остается.
У алхимии свой метакласс, у абстракции свой. Каждый метакласс "уникален", то бишь если хоть один из твоих двоих метаклассов не вызовет тот же самый супер, то один из них не сработает. Тебе нужно объединить эти два метакласса правильно
Обсуждают сегодня