Декоратор классов, совместимый с Mypy
Скажем, у меня есть следующий простой пример без каких-либо подсказок:
def wrapper(cls):
class Subclass(cls):
def subclass_method(self):
pass
return Subclass
@wrapper
class Parent:
def parent_method(self):
pass
p = Parent()
p.parent_method()
p.subclass_method()
Как я могу реструктурировать этот код с помощью подсказок, чтобы при запуске
mypy
против экземпляра
Parent
, он распознает и то, и другое.
parent_method
?
Возможные решения:
- Использование миксина
Parent(Mixin)
: Работает, но избегает декоратора. Можно ли добиться без? - Исправление метода в существующем классе: все еще есть та же проблема с разрешением
subclass_method
в моем - Пользовательский плагин Mypy: не знаю, с чего начать с этого, и возможно ли это без него.
1 ответ
Это было бы намного проще без обертки вообще.
class SomeMixin:
def subclass_method(self):
pass
class Parent(SomeMixin):
def parent_method(self):
pass
p = Parent()
p.parent_method()
p.subclass_method()
Здесь вы определяете один раз , а не один раз за вызов оболочки, и класс
SomeMixin
известно статически. Все различные классы с именем
Subclass
создаются динамически и
mypy
не может знать статически , какой класс имя
Parent
на самом деле обязан.