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 ответов

10 просмотров

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

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

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

У нас была задача сохранить Double в строку и потом восстановить обратно (до точного совпадения побайтно). Не смогли написать. Сделали хранение байтового представления в виде ...
Сергей Данилов
12
А как называется четырехбайтовое число в делфи на всех платформах?
Моринаро
19
Guys, what's better for this scenario? a x64 cpu or an arm cpu when handling a linux distro and USB devices like usb modems to manage network connections, proxy servers, etc? ...
Eduard Rivas
4
Всем привет🤚 Вопрос такой, хочу сделать свою карту для сайта с отмеченными на ней точками, при наведение на которые будет отображаться информация. Карту можно приближать, отда...
Василий Плешанов
17
.MODEL SMALL .STACK 100h .DATA array DW 12, 23, 34, 45, 56, 67, 78, 89 arraySize DW 8 choice DB ? newline DB 13, 10, '$' .CODE start: MOV AX, @DATA M...
Дима
1
@Mont4nk3, привет! С чем пожаловал?
Alexey
10
а вот забавно получается дельфевое приложение смотрится при 100% и 125% масштабировании экрана. Какие опции в дельфе надо покрутить?
Ed Doc
16
Добрый день! Интересна разработка на PHP, хотелось бы пройти обучение. Подскажите, какие школы сейчас сильные на нашем рынке?
Umka
14
В D11-64 посыпалась функция округления вещественного до определенного знака, что у нас была. Стала выдавать лишние дроби в конце. function FloatRound(aPrec: Integer; aTrunc: B...
Катерина Свиридова
3
Это бесполезная, глупая и нереализуемая функция в мире ассемблера. Какая там документация по-твоему должна быть? Felix? WinAPI? Linux syscalls? Нет.
КТ315
6
Карта сайта