Могу ли я сказать, что для python-статической типизации / mpy "этот метод имеет такую ​​же / похожую сигнатуру типа, как метод X"? - PullRequest
3 голосов
/ 27 июня 2019

Я пытаюсь переопределить метод инициализатора, но не копирую всю статическую типизацию из базового метода:

class BaseClass:
    def __init__(self, *, message: str, error_code: int):
        self.message = message
        self.error_code = error_code

class SubClass(BaseClass):
    def __init__(self, *, details: str, **kwargs):
        super().__init__(**kwargs)
        self.details = details

Мне бы очень хотелось, чтобы мне не приходилось копировать подпись BaseClass.__init__ вSubClass.__init__ чтобы получить статическую проверку параметров.Можно ли указать статической типизации / mypy, что SubClass.__init__(**kwargs) являются параметрами / типами, объявленными в BaseClass.__init__?

Мне не удалось найти синтаксис или модель «делегирования типизации», которая позволяла бы это послепрочитав как документацию python для ввода , так и чит-лист mypy

В идеале я хотел бы, чтобы код, подобный следующему, вызывал ошибку mypy /предупреждение:

SubClass(message="foo", error_code=13, details="badness", stack_trace=[1, 2, 3])

Подкласс не принимает аргумент с именем «stack_trace».

1 Ответ

0 голосов
/ 27 июня 2019

Краткий ответ: нет, есть запрос на открытую функцию .

В вашем конкретном случае вы можете использовать классы данных, чтобы сообщить mypy о kwargs:

MYPY = False

if MYPY:
    from dataclasses import dataclass

    @dataclass
    class BaseClass:
        message: str
        error_code: int

    @dataclass
    class SubClass(BaseClass):
        details: str
else:
    class BaseClass:
        def __init__(self, *, message: str, error_code: int):
            self.message = message
            self.error_code = error_code

    class SubClass(BaseClass):
        def __init__(self, *, details: str, **kwargs):
            super().__init__(**kwargs)
            self.details = details

Приведенный выше код проверяет наличие последней версии mypy, выявляет неправильное использование вашего класса и по-прежнему работает на версиях Python без классов данных.Вы можете поместить определение класса данных в файл .pyi, чтобы включить поддержку Python 2.

Вы также можете полностью избавиться от кода __init__ и использовать классы данных, если вы можете отбросить старые версии Python.

...