Когда Python только начинался, никто особо не парился о типах. Все же «duck typing», «мы не такие как Java», свобода! Но вот прошло время, проекты разрослись, и внезапно выяснилось: без типизации реально тяжело. Особенно если ты не единственный человек, кто трогает код. Аннотации типов, type hints, и статическая проверка (типа mypy) — это не про занудство, а про то, чтобы не ловить баги в проде и не страдать при рефакторинге. Давайте разберёмся, как это работает, зачем оно надо и как внедрять у себя.
Возможности
- Явно указываешь, какие типы ждёшь на входе и что возвращаешь из функции.
- Статическая проверка кода до запуска — не надо ждать, пока тесты или пользователи словят ошибку.
- Удобнее читать чужой код — сразу понятно, что ожидать.
- Интеграция с IDE — автокомплит, подсказки, меньше тупых ошибок.
- Работает и для простых скриптов, и для больших микросервисов.
Что требуется
- Python 3.6+ (лучше 3.8+, там больше фич для типизации)
- Любая ОС: Linux, macOS, Windows — не принципиально
- pip
- Желательно IDE с поддержкой type hints (PyCharm, VSCode, Vim с LSP)
Установка — пошаговая инструкция
- Проверь версию Python:
python --version
Если меньше 3.6 — обновляйся, иначе смысла нет.
- Установи mypy — это самый популярный статический анализатор для Python:
pip install mypy
- Проверь установку:
mypy --version
- Добавь аннотации в свой код:
def add(a: int, b: int) -> int: return a + b
- Проверь код:
mypy script.py
Если всё ок — увидишь «Success: no issues found in 1 source file».
- Добавь в проектный requirements.txt:
mypy
Чтобы не забыть.
- Для больших проектов — создай конфиг:
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, не ленись ставить типы, и твой проект скажет тебе спасибо.
Официальные ссылки:
Ваш отзыв