Запретить нетипизированные определения, кроме как в тестовом каталоге

Я хотел бы применять подсказки типов в исходном коде пакета, но не в тестовом коде. Есть ли способ использовать 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.

Надеюсь, это не станет нормой. Типизация — интересный вариант, но я не хочу, чтобы Python превратился в ад метапрограммирования, который сейчас завораживает C++.

Tim Roberts 21.08.2024 20:30

Подсказки по типу остаются необязательными, даже если к mypy добавлена ​​конфигурация pyproject.toml. Вы можете просто не запускать mypy в коде или использовать средство проверки типов, отличное от mypy, или переопределить pyproject.toml в командной строке при запуске mypy. Сам код будет выполняться одинаково во время выполнения независимо от того, как настроена проверка типов.

chepner 27.08.2024 18:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете настроить 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.*"]

Таким же образом можно настроить большинство других флагов конфигурации для каждого модуля.

Другие вопросы по теме