Python: все ошибки подсказок типа в структуре подкласса игнорируются

У меня есть следующий код с подсказками типа python. В нем есть куча ошибок. Mypy находит все ошибки в коде, но не ошибки в конструкторе S. Почему? не могу понять что происходит спасибо

код:

import typing

class T(object):
    def __init__(self, a: int, b: str = None) -> None:
        self.a = a
        self.b: typing.Union[str, None] = b
        self._callback_map: typing.Dict[str, str] = {}


class S(T):
    def __init__(self):
        super().__init__(self, 1, 2)
        self._callback_map[1] = "TOTO"
        s = T(1, 1)
        t = T(1, b=2)
        t._callback_map[2] = "jj"


s = T(1, 2)

t = T(1, b=2)
t._callback_map[2] = "jj"

вывод mypy:

 t.py:22: error: Argument 2 to "T" has incompatible type "int"; expected "Optional[str]"
t.py:24: error: Argument "b" to "T" has incompatible type "int"; expected "Optional[str]"
rt.py:25: error: Invalid index type "int" for "Dict[str, str]"; expected type "str"

Это нормально, но те же ошибки (те же строки) в 'init' в строке 16, 17, 18 вообще не найдены...


person Olivier RD    schedule 24.05.2018    source источник
comment
Я считаю, что b в class T(object) относится к type str, и вы передаете int из class S(T), почему?   -  person Surya Tej    schedule 24.05.2018


Ответы (1)


Mypy по умолчанию проверяет только те функции и методы, которые имеют аннотации типа.

Конструктор вашего подкласса не имеет аннотаций и, следовательно, не проверяется.

Чтобы это исправить, измените подпись, чтобы она читалась как def __init__(self) -> None.

Вы также можете попросить mypy пометить эти ошибки для вас, используя флаг --disallow-untyped-defs. Вы также можете использовать флаг --check-untyped-defs, который заставит проверять тип всех функций, независимо от того, есть ли у них аннотации.

person Michael0x2a    schedule 24.05.2018
comment
совершенно правильно. Спасибо. Это был довольно неинтуитивный дефолт - person Olivier RD; 25.05.2018
comment
@OlivierRD: причина здесь в том, что PEP 484 хочет рассматривать обычный нетипизированный код как полностью динамический. Это хорошее свойство, поскольку оно означает, что обычный нетипизированный код Python автоматически совместим с PEP 484: у вас нет разделения в семантике между обычным кодом Python и типизированным кодом Python. Эта функция также позволяет людям добавлять подсказки типов в существующие большие кодовые базы и исправлять ошибки постепенно, а не все сразу. - person Michael0x2a; 25.05.2018