0Pricing
Python Academy · Урок

Запуск mypy и исправление ошибок типов

Настраивайте mypy, интерпретируйте ошибки и постепенно типизируйте кодовую базу.

«Запуск mypy и исправление ошибок типов» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Установка и запуск mypy

Установите mypy с помощью pip и запустите его для файла или пакета. Он сообщает об ошибках типов, не выполняя ваш код.

# pip install mypy

# Check a single file:
# mypy script.py

# Check a package:
# mypy mypackage/

# Strict mode (recommended for new code):
# mypy --strict script.py

Первая ошибка mypy

mypy обнаруживает несовместимые типы, отсутствующие возвращаемые значения и аргументы функций без аннотаций.

# script.py
def add(a, b):   # mypy: Missing type annotation
    return a + b

result: int = add("hello", 1)  # str, not int

# mypy output:
# error: Returning Any from function declared to return "int"

Флаг --strict

--strict включает множество дополнительных проверок: отсутствующие аннотации, использование Any, импорты без типизации и прочее. Начните без него и постепенно добавляйте проверки.

# Most important strict flags individually:
# --disallow-untyped-defs
# --disallow-any-generics
# --warn-return-any
# --no-implicit-reexport

# Or all at once:
# mypy --strict mypackage/

Игнорирование ошибок

Добавьте # type: ignore в конец строки, чтобы подавить конкретную ошибку. Используйте это редко и добавляйте комментарий с объяснением причины.

import third_party  # type: ignore[import]  # no stub available

x: int = get_dynamic_value()  # type: ignore[assignment]

Конфигурация mypy.ini / pyproject.toml

Храните настройки mypy в mypy.ini или pyproject.toml, чтобы не передавать флаги при каждом запуске.

# mypy.ini
[mypy]
python_version = 3.11
strict = True
ignore_missing_imports = True

[mypy-third_party.*]
ignore_errors = True

Инкрементальный режим

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

# First run:
# mypy mypackage/   — full analysis, ~5 s

# Second run (nothing changed):
# mypy mypackage/   — Success: no issues in 0 source files (0.3 s)

Распространённая ошибка: несовместимые типы

Самая частая ошибка: присваивание или передача значения неправильного типа.

# error: Incompatible types in assignment
# (expression has type "str", variable has type "int")

count: int = 0
count = "five"   # error

# Fix:
count = 5

Распространённая ошибка: несоответствие типов аргументов

Передача функции аргументов неправильного типа.

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

# error: Argument 1 to "greet" has incompatible type "int"
greet(42)   # error

# Fix:
greet(str(42))

Распространённая ошибка: неожиданный возврат None

Функция объявлена как возвращающая значение, отличное от None, но один из путей выполнения возвращает None.

# error: Missing return statement
def find(items: list[int], target: int) -> int:
    for item in items:
        if item == target:
            return item
    # Missing: no return if not found!

# Fix:
def find2(items: list[int], target: int) -> int | None:
    for item in items:
        if item == target:
            return item
    return None

Сужение типа с помощью isinstance

Используйте isinstance, чтобы сузить тип Union внутри ветви. mypy понимает эту проверку и сужает тип.

def process(value: int | str) -> str:
    if isinstance(value, int):
        return str(value * 2)   # mypy knows value is int here
    return value.upper()         # mypy knows value is str here

Использование cast

typing.cast(Type, value) сообщает mypy, что значение следует считать заданным типом, не влияя на выполнение программы. Используйте это только тогда, когда уверены в своей оценке больше, чем mypy.

from typing import cast

def get_value() -> object:
    return 42

result = cast(int, get_value())   # mypy treats result as int
print(result + 1)   # 43

Быстрая проверка

Что делает добавление # type: ignore в строку?

Итоги

Запустите mypy script.py, чтобы проверить типы. Исправляйте несовместимые присваивания, несоответствия типов аргументов и отсутствующие возвращаемые значения. Используйте isinstance для сужения объединений типов, применяйте # type: ignore редко, а настройки mypy храните в mypy.ini. Постепенно включайте --strict.

Часто задаваемые вопросы

Урок «Запуск mypy и исправление ошибок типов» бесплатный?

Да — полный текст урока «Запуск mypy и исправление ошибок типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Запуск mypy и исправление ошибок типов»?

Настраивайте mypy, интерпретируйте ошибки и постепенно типизируйте кодовую базу. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

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

Сколько времени занимает урок «Запуск mypy и исправление ошибок типов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы аннотаций типов
  2. Сложные типы: List, Dict, Optional, Union
  3. TypeVar, обобщённые классы и Protocol
  4. Запуск mypy и исправление ошибок типов
← Назад к Python Academy