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 шт):

Автор решения: insolor

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 изначально нашел добавлением всех этих флагов и запуском с удалением флагов по одному.

→ Ссылка