mypy пропускает несоответствие типов внутри метода
def func1(a_value: int) -> None:
"""Тест1."""
print(a_value)
def func2():
"""Тест2."""
value_b = func1('11')
print(value_b + 10)
func2()
при проверке mypy не выдает никаких ошибок, считает, что все в порядке.
Если же после вызова func2 добавить строчку:
value_b = func1('11')
то сразу же идут сообщения об ошибках:
error: "func1" does not return a value
error: Argument 1 to "func1" has incompatible type "str"; expected "int"
Почему mypy игнорирует ошибки внутри метода func2 ?
Ответы (1 шт):
mypy по умолчанию не проверяет код внутри функций, у которых нет аннотаций (видимо, так сделано для того, чтобы можно было добавлять аннотации постепенно).
Выдержка из документации:
No errors reported for obviously wrong code
There are several common reasons why obviously wrong code is not flagged as an error.
- The function containing the error is not annotated. Functions that do not have any annotations (neither for any argument nor for the return type) are not type-checked, and even the most blatant type errors (e.g.
2 + 'a') pass silently. The solution is to add annotations. Where that isn’t possible, functions without annotations can be checked using--check-untyped-defs.
То есть, если второй функции указать возвращаемое значение -> None или при вызове mypy добавить флаг --check-untyped-defs, тогда код внутри второй функции начнет проверяться:
$ mypy --check-untyped-defs test.py
test.py:8: error: "func1" does not return a value
test.py:8: error: Argument 1 to "func1" has incompatible type "str"; expected "int"
Found 2 errors in 1 file (checked 1 source file)
Для любителей хардкора также могу порекомендовать флаг --strict, при его включении выдаст целых 4 ошибки:
$ mypy --strict test.py
test.py:6: error: Function is missing a return type annotation
test.py:6: note: Use "-> None" if function does not return a value
test.py:8: error: "func1" does not return a value
test.py:8: error: Argument 1 to "func1" has incompatible type "str"; expected "int"
test.py:12: error: Call to untyped function "func2" in typed context
Found 4 errors in 1 file (checked 1 source file)
Включение --strict эквивалентно включению следующих флагов (список получен с помощью запуска mypy -h): --warn-unused-configs, --disallow-any-generics, --disallow-subclassing-any, --disallow-untyped-calls, --disallow-untyped-defs, --disallow-incomplete-defs, --check-untyped-defs, --disallow-untyped-decorators, --no-implicit-optional, --warn-redundant-casts, --warn-unused-ignores, --warn-return-any, --no-implicit-reexport, --strict-equality.
Собственно, нужную опцию --check-untyped-defs изначально нашел добавлением всех этих флагов и запуском с удалением флагов по одному.