как есть:
class ABCModel(ABC):
@classmethod
@abstractclassmethod
def from_data(cls, data: dict) -> 'ABCModel':
return cls(**dict)
class ConcretModel(ABCModel):
@classmethod
def from_data(cls, data: dict) -> ABCModel:
return super().from_data(data)
И вот здесь меня просто порвало с работы mypy. Это говно откровенно доебался до сигнатуры метода в реализации, выдавая ошибку
Signature of "from_data" incompatible with supertype "ABCModel"
Почему все так дрочат на это поделие, если при совершенно одинаковых сигнатурах, оно очевидно выдает тупорылую ошибку на ровном месте? Я уже блядь не знаю что еще поправить надо, что бы по его мнению сигнатуры методов сходились
Это магия типов питона, я даже не знаю че ответить ибо я сам до сих пор мучаюсь ведь это настолько тонкое говно что лучше ctypes уже тянуть
Ты бы еще тайпскрипт попробовал
Вообще у тебя как минимум дикт не типизирован, странно что майпай на это не ругается, мб хотя бы dict[Any, Any]
dict[Any, Any] == dict как по мне должен быть, хотя меня когда-то этот вопрос волновал, но я хуй положил
class ABCModel(ABC): @classmethod @abstractclassmethod def from_data(cls) -> 'ABCModel': return cls() class ConcretModel(ABCModel): @classmethod def from_data(cls) -> ABCModel: return super().from_data() Вот так выдает то же самое например
Кстати как оно может вызывать абстрактный метод? Попробуй создать прослойку class Foo(ABCModel) class ConcertModel(Foo)
может. читай документацию
А, ну я почекал PEP8 там разрешено возвращать что либо из абстрактного метода
Ты ведь в курсе, что документация питона пеп8 не ограничена?
Обсуждают сегодня