Аннотация типов может сильно помочь при работе над большим проектом на Python: многие ошибки в дизайне и использовании функций выявляются практически сразу. Конечно, для этого требуется использование внешних инструментов для статического анализа, таких как MyPy. Это великолепный инструмент, но он поддерживает третью ветку Python. Поддержка Python 2.7 в нём требует некоторой подготовки.
Type comments vs stub files
Для начала нужно определиться, как аннотировать типы в коде. Для второй ветки Python есть два варианта: аннотирование в комментариях или использование стаб‑файлов. Я предпочитаю первый путь: он информативнее (типы перед глазами) и его легче поддерживать.
К недостаткам этого подхода можно отнести то, что необходимо импортировать модуль typing. Это выглядит весьма странно: я добавляю в код комментарии, а модуль должен импортироваться по‑настоящему. К счастью, когда проект всё‑таки переедет на Python 3, этот импорт будет смотреться более органично.
Использование стаб‑файлов оказалось не вариантом для основной кодовой базы. Этот подход хорош для внешних библиотек. Но для своего кода необходимость поддерживать ещё один набор файлов — перебор.
Запуск MyPy
MyPy работает под Python 3.5. Потребуется поставить и настроить пару вещей до того, как MyPy проверит первые строки кода на второй ветке Python:
- Установите Python 3.5 где‑нибудь в системе. Я предпочитаю
pyenvдля этого. Создайтеvirtualenvи запуститеpip install mypy-langв нём. - Вернитесь к своему виртуальному окружению проекта на Python 2. Установите там бэкпорт библиотеки типов:
pip install typing.
Теперь можно проверить установку. Активируйте виртуальное окружение MyPy и запустите mypy --py2 в папке с вашим проектом.
Интеграция с PyCharm
Конечно, PyCharm уже имеет хорошую систему аннотирования и проверки типов. Но она работает не только с синтаксисом, описанным в PEP, но и с собственным синтаксисом от JetBrains. А самое главное — этот синтаксис не понимает MyPy, а PyCharm не засунешь в CI. Вот поэтому я рекомендую настроить проверку MyPy при сохранении файла в IDE:
- Перейдите в Preferences → Tools → File Watchers.
- Добавьте новый Watcher и назовите его MyPy.
- В секции Watcher Settings выберите Python file в поле File type.
- В поле Program укажите путь к исполняемому файлу
mypyвнутри виртуального окружения. - В поле Arguments укажите следующее:
--py2 -s --check-untyped-defs $FilePath$. - Нажмите OK.