Содержание:
- Что такое типизация
- Проверка типа в Python
- Лучшие инструменты проверки типа данных
С самого начала типы данных в Python не обозначались. Это отвечало общей цели сделать язык быстрым и простым для работы. Ведь гибкие типы объектов позволяют разработчикам использовать различные уловки при написании кода, делающие его короче.
Сам «змеиный» язык не проверяет типы при выполнении кода — по крайней мере, пока. Но за последние годы в Python появилась поддержка аннотации типов. Это породило создание целой серии ПО, занятого проверкой типов на этапе разработки.
Дополнив привычную среду разработки (IDE) хорошим инструментом проверки типов, можно использовать аннотации типов Python, чтобы отсеять многие часто возникающие ошибки до релиза.
В этой статье мы рассмотрим четыре основных модуля проверки типов данных для Python. Все они реализованы примерно одинаково — сканируют код Python с аннотациями типов и дают обратную связь. Но каждое прилагает к такой базе свои полезные дополнения.
Что такое типизация
До того как рассматривать те или иные средства, с помощью которых осуществляется проверка типа данных, следует кратко рассмотреть саму типизацию и её применение в Python.
Разработчик вносит информацию в переменные/функции/их аргументы. Свойства записанных данных определяются путём присваивания определённого типа. А то, как взаимодействует с типами данных язык программирования, называется типизацией.
Виды типизации в Python
- Динамическая. Определение типа переменных происходит при выполнении программы. Разработчику не нужно точно присваивать тип переменной, как такое происходит при статической типизации.
- Неявная. Разработчику не требуется явно указывать типы данных, за это отвечает компилятор/интерпретатор.
- Строгая. Python не позволяет смешивать типы данных. Если разработчик совершит ошибку (например, попытается сложить строку и целое число), то интерпретатор выдаст ошибку.
Проверка типа в Python
Python поддерживает аннотацию типов – указание типов данных, как и при статической типизации. Использованные разработчиком инструкции не будут считываться интерпретатором, но помогут при работе со статическими анализаторами кода для проверки типов Python.
Преимущества аннотации типов данных
- Повышение читабельности и общего качества кода. Программист не путается в типах данных, так как они явно указаны в коде.
- Обнаружение ошибок. При использовании анализатора все ошибки будут заранее указываться в консольной версии программы или в используемом IDE.
- Облегчение конечной проверки кода. Проверка типов позволяет исключить использование модульных тестов, что ускоряет процесс разработки.
Лучшие инструменты проверки типа данных
Mypy
Mypy может считаться самым первым инструментом проверки типов данных для Python. Работа над библиотекой началась в 2012 году, и её до сих пор активно развивают. Mypy стала прототипом для других подобных сторонних библиотек в Python, хотя с тех пор появилось и немало новых инструментов, расширивших её функции.
Инструмент Mypy можно запустить отдельно или из командной строки. Его также можно сделать частью редактора или встроить в IDE в роли средства контроля кода (линтера).
Поддержка
Многие IDE и редакторы имеют встроенную поддержку Mypy. Модуль Python для Visual Studio Code тоже может работать с системой напрямую. При запуске Mypy создаёт отчёт о согласованности кода на основе почерпнутой из него информации о типах данных.
Если код не поддерживает аннотации типов, Mypy не выполнит львиной доли проверок из своего арсенала. Но инструмент можно также использовать, чтобы сделать определение типа без аннотации. Сделать это можно с помощью нескольких степеней строгости проверки на тип данных, в зависимости от целей.
Принципы работы
Если начинать базу исходного кода с нуля и превентивно следовать жёсткой стратегии линтинга (статистического анализа кода), опция «—strict» не разрешит любой код без типизации.
Но предположим, что мы работаем с унаследованным кодом, в котором объявлений типов немного. Тогда подойдут более мягкие варианты. Например, можно запретить только определения функций без объявления типа, используя опцию «—disallow-untyped-defs» и допуская другой нетипизированный код. Кроме того, всегда можно оградить отдельные строки от проверки внутристрочными комментариями вида «# type: ignore».
Файлы заглушки
Mypy позволяет задействовать stub-файлы (заглушки), предусмотренные документом PEP 484, и использовать аннотации типов для публичных интерфейсов модулей. К тому же, в Mypy доступен специальный плагин stubgen. Этот инструмент автоматически создаёт stub-файлы на основе имеющегося кода.
Для нетипизированного кода stub-файлы будут содержать универсальные типы (дженерики), которые затем можно разметить нужным образом.
Pytype
Инструмент Pytype, созданный Google, отличается от Mypy использованием так называемого «вывода типов» (inference), вместо обычного дескрипторов типа. Это значит, что Pytype пытается определить типы путём анализа потока кода, а не полагается исключительно на аннотации.
Принципы работы
Везде, где это имеет смысл, Pytype проявляет снисходительность. Если есть операция, которая при выполнении нормально работает и не противоречит аннотациям, то Pytype не будет препятствовать процессу.
Но это также значит, что проблемы, на которые следовало бы указать, замечены не будут. Например, объявление переменной с типом и затем её переобъявление в том же контексте.
Функционал
Для добавления в код аннотации типов особенно пригодится такая функция Pytype, как «reveal_type». Если добавить в код выражение «reveal_type(expr)», то Pytype установит тип «expr» и выдаст предупреждение, в котором он будет указан.
Обращаем внимание. Некоторые характеристики Pytype управляются вставкой атрибутов в сам код. Например, чтобы Pytype прекратил жалобы на отсутствующие динамические атрибуты или модули, нужно не менять что-то в метаданных конфигурации, а добавить атрибут «_HAS_DYNAMIC_ATTRIBUTES = True» в нужные классы или модули.
Pyright
Pyright — средство проверки типов данных для Python от Microsoft. Он присутствует в Visual Studio Code как часть Pylance — бесплатного модуля языкового сервера Python. Этот многофункциональный инструмент Python — проверка типов сочетается в нём с линтингом кода.
Принципы работы
Как и Pytype, Pyright может работать с базами исходного кода, которые не имеют информацию о типах. В таких случаях Pyright постарается выполнить вывод «используемых типов» (type inference).
Можно получить неплохой результат с Pytype на старом коде без объявления типов. Но со временем можно выиграть больше, если последовательно снабдить код аннотациями типов.
Функционал
Как и другие инструменты проверки типов данных, Pyright можно настраивать по-разному для каждого проекта. Для этого используют файл конфигурации в формате JSON в каталоге проекта. В этом файле отдельные пути могут исключаться (никогда не проверяться) или игнорироваться (ошибки и предупреждения будут скрыты).
В VS Code «рабочие области» (workspace) с несколькими корневыми каталогами могут использовать отдельные конфигурации Pyright, если разные части проекта требуют особой настройки линтинга.
Ещё можно определить внутри проекта несколько «сред выполнения» (execution environment). Каждая получит своё «виртуальное окружение» (venv) или «путь импорта» (import path).
Pyre
Pyre создан разработчиками Facebook и Instagram. По сути, это два инструмента в одном:
- система проверки типов (Pyre);
- средство статистического анализа кода (Pysa).
Оба созданы для совместной работы, чтобы обеспечить более высокий уровень проверки и анализа, чем другие инструменты. Однако, чтобы получить все преимущества, пользователь должен приложить немного усилий.
Принципы работы
Подход Pyre аналогичен Pytype и Mypy. С кодом без типизации данных программа обращается снисходительней, чем с типизированным. Поэтому можно взять нетипизированный код и добавлять в Python аннотации пошагово: функцию за функцией, модуль за модулем.
Если включить «строгий режим» (strict mode), Pyre отметит все пропущенные аннотации. Можно также выставить строгий режим по умолчанию, отключая его на уровне модулей. Pyre работает и со stub-файлами в формате «.pyi».
Функционал
У Pyre есть мощная функция для миграции баз исходного кода в типизированный формат. С опцией командной строки «infer» программа берёт файл или каталог, делает эмпирические предположения об использованных типах и применяет полученные аннотации к файлам.
Но перед этим стоит сделать их резервную копию. Если нужна информация о типах для выполняемой программы Python, у Facebook/Instagram есть для этого другой сервис — MonkeyType.
Особенности Pysa
По функциям инструмент Pyre аналогичен другим рассмотренным пакетам, но Pysa имеет свои уникальные преимущества. Этот модуль проверки выполняет для кода taint-анализ — ищет возможные проблемы безопасности. Pysa использует библиотеку потокового анализа определённых программных компонентов, после чего отмечает потенциально уязвимый код.
Всё, что связано с этим кодом, будет отмечено как «загрязнённое» (tainted). Впрочем, можно указать компоненты, которые обеспечат безопасность данных, убрав такие данные из «диаграммы загрязнения» (taint graph).
Недостаток в том, что библиотека Pysa для taint-анализа сторонних компонентов всё ещё мала. Поэтому может потребоваться создание собственной модели.
Однако, в этой библиотеке уже содержатся модели taint-анализа наиболее распространённого ПО. Например, в этот перечень входит веб-фреймворк Django, ORM-библиотека SQL Alchemy, библиотека анализа данных Pandas.
Нужна надёжная база для разработки программных продуктов? Выбирайте виртуальные сервера от Eternalhost с технической поддержкой 24/7 и бесплатной защитой от DDoS!
Автор оригинала: Serdar Yegulalp