mypy для проекта на Python 2.7

Опубликовано 29 July 2016 в Python

Аннотация типов может сильно помочь при работе над большим проектом на питоне: многие ошибки в дизайне и использовании функций выявляются практически сразу. Конечно для этого требуется использование внешний инструментов для статического анализа, таких как MyPy. Это великолепный инструмент, но он поддерживает третью ветку питона. Поддержка Python 2.7 в нем требует некоторой подготовки.

Type comments vs stub files

Для начала, нужно определиться как аннотировать типы в коде. Для второй ветки питона есть два варианта: аннотирование в комментариях или использование стаб файлов. Я предпочитаю первый путь. Он информативнее (типы перед глазами) и его легче поддерживать.

К недостатку этого подхода можно отнести то, что необходимо импортировать модуль typing. Это выглядит весьма странно: я добавляю в код комментарии, а модуль я должен импортировать по настоящему. К счастью, когда проект все-таки переедет на Python 3, этот импорт будет смотреться более органично.

Использования стаб файлов оказался не вариантом для основной кодовой базы. Этот подход хорош для внешний библиотек. Но для своего кода необходимость поддерживать еще один набор файлов - перебор.

Запуск MyPy

MyPy работает под Python 3.5. Потребуется поставить и настроить пару вещей до того, как mypy проверит первые строки кода на второй ветке питона.

  • Устанавливаем 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 executable внутри виртуального окружения. В поле Arguments должно быть следующее: --py2 -s --check-untyped-defs $FilePath$. Жмем OK.
---
Возник вопрос? Мне всегда можно написать в Twitter: avkorablev