← Назад к вопросам

Какие знаешь инструменты для проверки аннотации типов?

1.0 Junior🔥 101 комментариев
#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Инструменты для проверки аннотаций типов в Python

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

1. MyPy — де-факто стандарт

MyPy — это наиболее популярный и рекомендуемый инструмент для проверки типов:

# example.py
def greet(name: str) -> str:
    return f"Hello, {name}"

# Ошибка типа
result = greet(123)  # mypy ловит это
mypy example.py
# error: Argument 1 to "greet" has incompatible type "int";
# expected "str"

Основные возможности:

  • Проверка согласованности типов
  • Поддержка сложных типов (Union, Optional, Generic)
  • Режимы strictness (strict, normal)
  • Плагины для популярных библиотек
  • Incremental type checking

Конфигурация:

# mypy.ini
[mypy]
python_version = 3.10
warn_return_any = True
warn_unused_configs = True
strict = True  # Максимальный уровень проверки

2. Pyright / Pylance

Pyright — от Microsoft, встроен в VS Code (Pylance):

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

# Проверка
pyright --outputjson

Преимущества:

  • Быстрее MyPy на больших проектах
  • Интеграция в IDE более плотная
  • Лучше поддерживает новые возможности Python
  • Более ясные сообщения об ошибках

Конфигурация:

# pyrightconfig.json
{
  "typeCheckingMode": "strict",
  "pythonVersion": "3.10",
  "include": ["src"],
  "exclude": ["tests", "venv"]
}

3. Pydantic — валидация в runtime

Для проверки типов во время выполнения:

from pydantic import BaseModel, ValidationError

class User(BaseModel):
    name: str
    age: int

# Валидация при создании
try:
    user = User(name="Alice", age="not a number")
except ValidationError as e:
    print(e.errors())

# Успех
user = User(name="Alice", age=30)

Преимущества:

  • Проверка типов во время выполнения
  • Автоматическое преобразование типов
  • Интеграция с FastAPI
  • Детальные ошибки валидации

4. Ruff — быстрый линтер с проверкой типов

Ruff — высокопроизводительный линтер на Rust:

# Проверка типов (экспериментально)
ruff check --select I

Особенности:

  • Намного быстрее PyLint
  • Встроенные проверки типов
  • Совместимость с Black и isort

5. Protocol для структурного подтипирования

Проверка типов на основе поведения, а не наследования:

from typing import Protocol

class Writer(Protocol):
    def write(self, text: str) -> None: ...

class File:
    def write(self, text: str) -> None:
        pass

class StringIO:
    def write(self, text: str) -> None:
        pass

# Обе реализуют Writer, не наследуя его
def save(writer: Writer, text: str) -> None:
    writer.write(text)

6. TypedDict для словарей со строгими типами

from typing import TypedDict

class Person(TypedDict):
    name: str
    age: int
    email: str

def process_person(person: Person) -> None:
    print(person["name"])  # OK
    print(person["phone"])  # MyPy ошибка

7. Generic типы и type variables

from typing import TypeVar, Generic, List

T = TypeVar("T")

class Stack(Generic[T]):
    def __init__(self) -> None:
        self.items: List[T] = []
    
    def push(self, item: T) -> None:
        self.items.append(item)
    
    def pop(self) -> T:
        return self.items.pop()

# Использование
int_stack: Stack[int] = Stack()
int_stack.push(1)  # OK
int_stack.push("string")  # MyPy ошибка

Рекомендуемая конфигурация CI/CD

# Установка
pip install mypy pyright pydantic[email]

# В Makefile или pre-commit
type-check:
    mypy src --strict
    pyright src

lint:
    ruff check src
    mypy src

Лучшие практики

  • Начинай с MyPy в normal режиме, затем переходи на strict
  • Используй type hints везде для максимальной эффективности
  • Интегрируй в CI/CD обязательно
  • Комбинируй инструменты — MyPy для проверки, Pydantic для runtime валидации
  • Используй Protocol для гибкого типирования вместо ABC
  • Настраивай strictness gradually — не гонись за идеальностью сразу

Использование правильных инструментов предотвращает целый класс ошибок ещё до выполнения кода и делает рефакторинг безопаснее.

Какие знаешь инструменты для проверки аннотации типов? | PrepBro