170 похожих чатов

Ладно, похуй на mypy и его идиотические загоны с абстрактными

классами (в сети кстати овер дохера страданий на эту тему - не я первый), но у меня тут еще интереснее загон появился...

В общем мне надо абстрагировать поведение моделей алхимии от самих моделей, так как сервис в будущем может сменить систему хранения с бд на что-то другое (на что - пока не известно).

Сделал примерно так:

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 = ...

Вот только такой вариант тоже нихера не помогает и ошибка остается.

1 ответов

25 просмотров

У алхимии свой метакласс, у абстракции свой. Каждый метакласс "уникален", то бишь если хоть один из твоих двоих метаклассов не вызовет тот же самый супер, то один из них не сработает. Тебе нужно объединить эти два метакласса правильно

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта