Что такое MyPy и как он используется для статической типизации в Python?

Ответ

MyPy — это статический анализатор типов для Python. Он проверяет код на соответствие аннотациям типов (type hints) без его фактического выполнения, помогая выявлять ошибки, связанные с типами данных, на этапе разработки.

Как это работает:

  1. Разработчик добавляет аннотации типов к переменным, аргументам функций и возвращаемым значениям, используя стандартный синтаксис Python (PEP 484).
  2. MyPy анализирует код и сообщает о несоответствиях, например, когда в функцию, ожидающую строку, передается число.

Пример аннотации типов:

# Функция принимает строку и возвращает строку
def greet(name: str) -> str:
    return f"Hello, {name}"

# MyPy обнаружит здесь ошибку, так как 123 не является строкой
greet(123) 

# Эта переменная должна быть списком целых чисел
numbers: list[int] = [1, 2, 3]

Пример запуска проверки из командной строки:

# Установка
pip install mypy

# Запуск проверки для файла my_script.py
mypy my_script.py

Зачем использовать MyPy?

  • Обнаружение ошибок до запуска: Находит TypeError и другие проблемы на ранней стадии.
  • Улучшение читаемости кода: Типы служат самодокументацией.
  • Безопасный рефакторинг: IDE и редакторы кода используют типы для более точных подсказок и анализа кода.

Ответ 18+ 🔞

Да ты послушай, что за зверь такой — MyPy! Ну, это типа статический анализатор для Python, который по коду ползает и вынюхивает, где ты с типами накосячил. А делает он это, не запуская код вообще, просто смотрит на твои аннотации, как суровый надзиратель, и если что не так — сразу в душу: «Э, дружок-пирожок, тут у тебя число лезет, где строка должна быть!».

Как эта магия, блядь, работает:

  1. Ты, такой умный, расставляешь в коде подсказки — что куда должно приходить и что откуда вываливаться. Стандартный синтаксис, всё честно.
  2. А MyPy берёт этот код, свои очки на нос надевает и начинает проверять: «Ага, тут int припёрли, а в аннотациях str значится... Пиздец, нестыковочка!».

Вот смотри, как это выглядит вживую:

# Объясняем функции, что она ждёт строку и строку же отдаст
def greet(name: str) -> str:
    return f"Hello, {name}"

# А тут MyPy просто обоссается со смеху и напишет тебе гневное письмо:
# "Ты чё, мудак, 123 — это строка, что ли?"
greet(123)

# А тут говорим прямо: «Этот список — только для целых чисел!»
numbers: list[int] = [1, 2, 3]

Как его, этого сторожа, запустить-то?

# Сначала ставим, ясное дело
pip install mypy

# А потом тыкаем его в твой скрипт, как палкой
mypy my_script.py

И нахуй он вообще нужен, этот MyPy?

  • Ловит косяки до того, как ты их запустишь. Представь, избегаешь ты целую кучу TypeError ещё на берегу, ебать мои старые костыли!
  • Код читать легче. Глянул на аннотации — и сразу ясно, что функция жрёт и что блюёт. Самодокументация, хуле.
  • Рефакторить не так страшно. Твоя IDE, вооружённая этими типами, будет тебе умные подсказки сувать и предупреждать, если ты какую-то дичь затеял. Безопасность, блядь, почти как в банке.