Перейти к содержимому

Mypy python что это

  • автор:

Статические анализаторы mypy и pyright

mypy это инструмент, который устанавливается отдельно как pip-пакет и запускается в проекте как часть тестов или CI/CD процесса. Перед сборкой и раскаткой приложения на сервер запускается проверка исходного Python-кода с mypy и если mypy находит ошибки, то процесс останавливается, разработчики исправляют найденные ошибки и процесс повторяется. Это приводит к тому, что до продакшн, то есть до рантайма и до живых пользователей соответственно ошибок долетает меньше, потому что многое выявляется на более ранних этапах.

В директории проекта создадим и активируем виртуальное окружение, установим в него mypy и запустим проверку нашего кода:

python3.10 -m venv env . ./env/bin/activate pip install mypy mypy ./weather 

Как видим, mypy не нашёл проблем в нашем коде. Внесём специально ошибку в код и убедимся, что mypy её найдёт:

Запуск mypy можно встроить в процесс CI/CD, чтобы процесс разворачивания приложения на серверах не запускался, если проверки mypy не прошли. Таким образом до runtime не смогут дойти ошибки, связанные с некорректным использованием типов данных, и это здорово — надёжность приложения значительно возрастает!

И ещё важно отметить, что используя mypy, вы можете проверять корректность своих тайп-хинтингов, которые вы указали. Пока учишься могут быть вопросы, правильно ли указан тип — вот можно указать тип у параметра функции, вызвать эту функцию с данными и посмотреть, как поведёт себя проверятор типов, встроенный в IDE, и как поведёт себя mypy .

Помимо mypy пользуется популярностью анализатор pyright . Они работают по-разному, например, такой код валиден с точки зрения mypy (и с точки зрения анализатора, встроенного в PyCharm IDE), но невалиден с точки зрения pyright :

class User: def __init__(self): self.name: str = "Petr" def yo(self): self.name = <> 

Анализаторы кода продолжают развиваться и дорабатываться, они неидеальны, но проставлять подсказки типов — обязательное условие для серьёзных проектов. Анализаторы кода достаточно умны уже сейчас и станут ещё умнее в будущем.

3 инструмента для Python, которые упростят работу с кодом

Разбор полезных инструментов для Python с функциями умного ИИ автодополнения, статического и динамического анализа кода.

С опытом количество используемых в работе инструментов сокращается, поскольку многие из них вы просто перерастаете. Но такие, как эти, остаются в использовании надолго.

Инструмент 1: ИИ автодополнение и быстрый доступ к документации с Kite

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

Встроенный инструмент обычно использует документацию для определения имён и типов возможных функций и параметров. Но что если редактор получит доступ к коду из всех публичных репозиториев GitHub и начнёт подтягивать не просто имена, а целые строки кода? И это реализовано в Kite.

Прим.ред. Такая функциональность доступна в планах Pro и Team. На момент написания материала для плана Pro действует бесплатная бета-версия.

Разберём подробнее особенности Kite — инструмента для Python с функциями умного автодополнения и быстрого доступа к документации.

Умные подсказки

Плагин Kite смотрит в комплексе ваш код, переменные, часто используемые имена параметров, документацию, и только после сбора всех данных рекомендует что-то вроде этого:

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

Copilot для документации

Прежде чем беспокоить более опытного коллегу или мчаться за ответами на Stack Overflow, почитайте документацию.

Kite Copilot упрощает поиск по документации. Он работает параллельно с IDE и показывает информацию о любых объектах или функциях, на которые наведён курсор.

Работает локально, приватно

Вдобавок ко всему, плагин создан для локальной работы, так что вы получаете быстрые советы, работа происходит в автономном режиме, и ваш код никогда не будет отправлен в облако.

Это крайне важно для людей с плохим интернет-соединением и тех, кто работает с закрытым исходным кодом.

Всё, что нужно сделать, это загрузить и установить плагин Kite для вашего редактора: есть бесплатная версия и Free Beta на Pro план с умным автозаполнением.

Инструмент 2: Статический анализ кода с Mypy

Python — динамически типизированный язык. Это значит, что переменная связывается с типом данных не в момент объявления, а в момент присваивания ей значения. То есть одна и та же переменная может быть и строкой, и целым числом, и каким-либо другим типом в зависимости от последнего присвоенного ей значения.

# Например, вот одна и та же переменная с разными типами данных. # Python определяет тип данных динамически: # string var_name = "string here" # integer var_name = 1234 

А вот примеры языков со статической типизацией, где для каждой переменной задан один конкретный тип данных, и в логике кода нужно придерживаться именно его:

# Для многих языков обязательно предварительное объявление типа. # string str str_var_name = "string here" # integer int int_var_name = 1234 

Плюсы и минусы динамической типизации

Главное преимущество динамической типизации в том, что вам может быть лень постоянно прописывать типы, и такой язык, как Python, в этом поможет.

А вот недостатков больше:

  • как правило, вы сталкиваетесь с ошибками на более поздних этапах разработки;
  • код работает медленнее, ведь Python постоянно вычисляет типы;
  • код становится менее безопасным, так как на входе и выходе функции у одной и той же переменной могут быть разные типы данных;
  • читать ваш код становится сложнее, поскольку другой человек не может быть уверен в том, что уже объявленная переменная не изменит свой тип в дальнейшем.

Статическая типизация в Python

В Python нет статической типизации как таковой, но есть аннотации типов, которые проверяются статическими анализаторами с целью контроля типов переменных.

Обратите внимание на Mypy. Это статический анализатор типов для Python, который позволяет находить ошибки несоответствия типов в коде. Mypy выводит ошибку, если при работе с аннотациями типов значение переменной не соответствует присвоенному ей типу.

from typing import Iterator def fib(n: int) -> Iterator[int]: a, b = 0, 1 while a < n: yield a a, b = b, a + b fib(10) fib("10")

В результате запуска статического анализатора Mypy в приведённом выше коде вы получите следующую ошибку: main.py:10: error: Argument 1 to "fib" has incompatible type "str"; expected "int" . Таким образом Mypy предупреждает, что мы пытаемся присвоить строковое значение переменной с целочисленным типом данных. Это лишь один из примеров использования Mypy. Все функциональные возможности инструмента, более подробно описанные в документации, можно протестировать в песочнице.

Если ваш код работает на проде, и вам важна его устойчивость к ошибкам, связанным с типизацией, используйте инструмент Mypy.

Инструмент 3: Быстрый поиск ошибок и чистый код с SonarLint

Сейчас почти во всех IDE есть линтер — статический анализатор возможных ошибок. Другими словами, он предугадывает ещё до запуска кода, что может пойти не так, и выделяет предполагаемые ошибки.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

В свою очередь, динамический анализ не предугадывает, а действительно запускает/компилирует части кода, чтобы определить, работает ли он, но делает это автоматически в фоновом режиме. То есть он на самом деле знает, что пойдёт не так в процессе выполнения программы.

SonarLint — это тот самый динамический анализатор кода, который поможет решить следующие проблемы.

Лишний код

Допустим, вы не удалили закомментированные части кода, оставили неиспользуемые функции и прочие рудименты. SonarLint предупредит об этом, и вы сможете своевременно очистить код от всего лишнего.

Уязвимости

Большая обновляемая база данных с перечнем уязвимостей позволяет плагину вовремя предупреждать о любых известных уязвимостях, которые встречаются в вашем коде.

Когнитивная сложность

Подробнее об этом можно прочесть в статье. Если говорить кратко, разработчики плагина создали математическую формулу, которая может оценить, насколько читабелен ваш код.

Это не только полезно, но и просто. Каждый раз, когда SonarLint предупреждает вас о чрезмерной сложности, это сопровождается объяснением правила, которое вы нарушили. Например, «слишком большая вложенность операторов if», более известная как спагетти-код. Удобно, правда?

Плагин SonarLint позволяет использовать лучшие практики и писать понятный чистый код.

Подытожим

  • ИИ автодополнение и быстрый доступ к документации с Kite Copilot и плагином для IDE.
  • Статическая типизация кода с модулем Mypy.
  • Быстрый поиск ошибок и чистый код с плагином SonarLint.

Все перечисленные инструменты для Python бесплатны или же поставляются в нескольких вариантах, включающих бесплатный.

Типизация в Python. Работа с Mypy, PyCharm и SQLAlchemy 2.0

Текст для Python-разработчиков, которые хотят углубиться в тему типизации. Приводим краткий обзор трех докладов с митапа «Типичный Python». Разбираем работу со средой разработки PyCharm, статическим анализатором Mypy и программной библиотекой SQLAlchemy 2.0.

Изображение записи

Мы в Selectel много программируем на Python. И на одном из митапов поделились своим опытом, послушали коллегу из МТС Digital, а также ответили на вопросы участников. Выбирайте доклад с интересующей вас темой и смотрите его в записи. А в конце текста вас ждет больше ссылок на полезные материалы по Python.

Собственный статический анализатор типов для Python

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

В тексте «Как и зачем у нас появился статический анализатор типов для Python» он описал опыт решения этой нетривиальной задачи и показал примеры с кодом.

А если вы хотите посмотреть и послушать версию, обогащенную персонажами из Mortal Kombat и ответами на вопросы, переходите к записи доклада.

Зачем нужна типизация, если duck typing это так удобно?

Александр Полищук — ведущий разработчик в МТС Digital — кратко объяснил, как типизация помогает держать код в чистоте, подсвечивать проблемные интеграции и сводить к минимуму количество ошибок runtime error.

Александр рассказал про возникновение Mypy и показал, что вошло в релизы Mypy 1.0 и 1.1.1. А еще разобрал новинки type hints в Python 3.11 и привел примеры их использования. В конце спикер ответил на вопросы зрителей.

Mypy — статический анализатор типов для Python, который позволяет находить ошибки несоответствия типов в коде. Впервые инструмент Mypy показал Юкка Лехтосало на PyCon в октябре 2012 года. В декабре 2012 года вышел первый релиз. В 2016 году инструмент поддержал создатель Python Гвидо ван Россум. В феврале 2023 года вышла версия 1.0, а в марте 2023 — версия 1.1.1.

Мажорный релиз SQLAlchemy

В начале этого года случился релиз SQLAlchemy 2.0 — программной библиотеки на Python для работы с реляционными СУБД. Наш инженер по разработке в команде дисков и бэкапов Анатолий Матвеев внимательно разобрал новинку.

Посмотрите запись его доклада. Анатолий рассказывает про изменения, связанные с PEP-484. Вы увидите, что хорошего сделали в релизе и как мигрировать на новую версию (спойлер: все хорошо, и выделять полгода на рефакторинг не придется).

Больше про Python: книги, игры, инструменты

В нашем блоге есть и другие статьи про Python.

Мероприятия в Selectel

Если вы хотите посмотреть записи прошедших вебинаров или зарегистрироваться на новые, заходите в раздел «Мероприятия».

Проверка типа данных в Python — 4 лучших инструмента

С самого начала типы данных в 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 установит тип «e xpr » и выдаст предупреждение, в котором он будет указан.

Обращаем внимание. Некоторые характеристики 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!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *