Запуск 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 — локальная установка не требуется.
Все уроки этого курса
- Основы аннотаций типов
- Сложные типы: List, Dict, Optional, Union
- TypeVar, обобщённые классы и Protocol
- Запуск mypy и исправление ошибок типов