Декоратор классов, совместимый с 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на самом деле обязан.

Другие вопросы по тегам