Проблема в том, что аннотации типов являются необязательными. Действительно, модуль re
не имеет аннотаций типов, даже в Python 3.8, казалось бы. Конечно, анализатор может проанализировать код Python, чтобы увидеть, что происходит. Тем не менее, для некоторого кода (например, модуля re
) код в конечном итоге погружается в C-API (в CPYthon). На этом этапе анализатор не может выяснить, что является сигнатурой типа функции. Как люди, мы можем читать документацию и знать, что re.sub
всегда возвращает экземпляр str
, но автоматизированные инструменты не могут узнать, если им не предоставляется дополнительная информация о типе.
Тогда у вас проблема в том, что некоторые функции возвращают объединения типов. например. оператор **
(int.__pow__
), который возвращает int
, float
или complex
в зависимости от типов и значений его операндов. например.
>>> 3 ** 2
9
>>> 3 ** -2
0.1111111111111111
>>> 2 ** 0.5
1.4142135623730951
>>> (-1) ** 0.5
(6.123233995736766e-17+1j) # should really just be 1j
Это означает, что, учитывая:
def f(x: int, y: int):
z = x ** y
z
будет присвоен тип object
(общая база int
, float
и complex
), что, скорее всего, не то, что требуется. Присваивая переменной аннотацию типа, мы можем разрешить mypy выполнять проверку типов при присваивании z
результата x ** y
, но любые будущие операции с z
могут смело предполагать, что тип z
будет любым это было определено как.