Я хотел бы применять подсказки типов в исходном коде пакета, но не в тестовом коде. Есть ли способ использовать disallow_untyped_defs = true
, исключив каталог тестов?
Вот что я пробовал:
pyproject.toml
:
[tool.mypy]
disallow_untyped_defs = true
untyped_calls_exclude = ["tests"]
src/mymodule/file.py
:
def hello_world() -> None:
print("hi there!")
пустой src/mymodule/__init__.py
и tests/test_file.py
:
def test_1():
assert 1 < 2
Но запуск mypy tests src/mymodule
возвращает:
tests/test_file.py:1: ошибка: в функции отсутствует аннотация типа возвращаемого значения [no-untyped-def]
tests/test_file.py:1: примечание: используйте «-> None», если функция не возвращает значение
Найдена 1 ошибка в 1 файле (проверено 3 исходных файла)
Я знаю, что могу ограничить входные каталоги, запустив mypy src/mymodule
, чтобы ограничить входные данные, но я все равно хотел бы просмотреть другие предупреждения подсказок типов в каталоге тестов. Я также хотел бы отключить ошибки untyped-def, возникающие при разработке расширения VSCode Mypy Type Checker.
Подсказки по типу остаются необязательными, даже если к mypy
добавлена конфигурация pyproject.toml
. Вы можете просто не запускать mypy
в коде или использовать средство проверки типов, отличное от mypy
, или переопределить pyproject.toml
в командной строке при запуске mypy
. Сам код будет выполняться одинаково во время выполнения независимо от того, как настроена проверка типов.
Вы можете настроить mypy
для отключения некоторых или всех ошибок в любом желаемом модуле. В pyproject.toml
следующее заглушит все mypy
ошибки в папке тестов (я всегда так делаю, поскольку набирать тесты для небиблиотечного кода слишком бессмысленно, но вы можете этого не захотеть).
[tool.mypy]
disallow_untyped_defs = true
[[tool.mypy.overrides]]
ignore_errors = true
module = ["tests.*"]
Следующее позволит разрешить только нетипизированные (полностью или частично) объявления:
[tool.mypy]
disallow_untyped_defs = true
[[tool.mypy.overrides]]
disallow_incomplete_defs = false
disallow_untyped_defs = false
module = ["tests.*"]
Таким же образом можно настроить большинство других флагов конфигурации для каждого модуля.
Надеюсь, это не станет нормой. Типизация — интересный вариант, но я не хочу, чтобы Python превратился в ад метапрограммирования, который сейчас завораживает C++.