Типизация в Python: аннотации типов и статическая проверка

Когда Python только начинался, никто особо не парился о типах. Все же «duck typing», «мы не такие как Java», свобода! Но вот прошло время, проекты разрослись, и внезапно выяснилось: без типизации реально тяжело. Особенно если ты не единственный человек, кто трогает код. Аннотации типов, type hints, и статическая проверка (типа mypy) — это не про занудство, а про то, чтобы не ловить баги в проде и не страдать при рефакторинге. Давайте разберёмся, как это работает, зачем оно надо и как внедрять у себя.

Возможности

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

Что требуется

  • Python 3.6+ (лучше 3.8+, там больше фич для типизации)
  • Любая ОС: Linux, macOS, Windows — не принципиально
  • pip
  • Желательно IDE с поддержкой type hints (PyCharm, VSCode, Vim с LSP)

Установка — пошаговая инструкция

  1. Проверь версию Python:
    python --version

    Если меньше 3.6 — обновляйся, иначе смысла нет.

  2. Установи mypy — это самый популярный статический анализатор для Python:
    pip install mypy
  3. Проверь установку:
    mypy --version
  4. Добавь аннотации в свой код:
    
    def add(a: int, b: int) -> int:
        return a + b
        
  5. Проверь код:
    mypy script.py

    Если всё ок — увидишь «Success: no issues found in 1 source file».

  6. Добавь в проектный requirements.txt:
    mypy

    Чтобы не забыть.

  7. Для больших проектов — создай конфиг:
    mypy --init

    Это создаст mypy.ini, где можно тонко настроить проверку.

Подробная дока: https://mypy.readthedocs.io/en/stable/

Использование, команды и варианты

  • Проверить файл:
    mypy my_script.py
  • Проверить папку (рекурсивно):
    mypy src/
  • Игнорировать ошибки (например, в сторонних либах):
    mypy --ignore-missing-imports src/
  • Проверять только изменения (ускоряет CI):
    mypy --incremental src/
  • Использовать конфиг:
    mypy --config-file mypy.ini src/
  • Дополнительные типы: можно ставить typing-extensions, если нужен TypedDict, Literal и т.п. для старых версий Python:
    pip install typing-extensions

Полный список опций: https://mypy.readthedocs.io/en/stable/command_line.html

Ошибки, как делать не надо

  • Не думай, что аннотации — это «магия» и Python станет статически типизированным! Это только подсказки для тебя и тулзов, рантайм не меняется.
  • Не смешивай типы ради «красоты». Если функция реально может вернуть None, так и пиши: Optional[int].
  • Не забывай про сторонние типы. Если используешь сложные структуры (например, dict[str, list[int]]), пиши явно.
  • Не игнорируй ошибки mypy. Если отключаешь проверки — делай это осознанно, а не потому что «ломается».
  • Не аннотируй всё подряд. Для простых скриптов это может быть избыточно, а вот для библиотек — мастхэв.

Пример реального использования в окружении

Допустим, у тебя микросервис на FastAPI, который жрёт данные из базы и возвращает JSON. Вот как это может выглядеть с типами:


from typing import List, Optional
from fastapi import FastAPI

app = FastAPI()

class User(BaseModel):
    id: int
    name: str
    email: Optional[str]

@app.get("/users/", response_model=List[User])
def get_users() -> List[User]:
    # тут какая-то магия с базой
    return [User(id=1, name="Vasya", email=None)]

Теперь запускаешь mypy, и если где-то случайно возвращаешь не тот тип — сразу узнаешь. В CI добавляешь шаг:

mypy src/

В результате — меньше багов, понятнее код, проще ревью.

Заключение

Типизация в Python — это не «Java-way», а реально удобный инструмент для живых проектов. Да, поначалу непривычно, но потом себя не узнаешь: и читаешь код проще, и багов меньше, и рефакторить не страшно. Используй mypy, не ленись ставить типы, и твой проект скажет тебе спасибо.

Официальные ссылки:

Хотите прочитать больше про Разное?
Отзывов нет.

Ваш отзыв

Пожалуйста, заполните поля снизу и добавьте отзыв!.
Имя *
E-mail *
Сайт
Сообщение *