Python после основ: тесты, объекты и управление ресурсами
Код уже решает задачу, но изменения становятся дорогими: тесты зависят от порядка запуска, кэш удерживает объекты, а подмена внешнего сервиса почему-то не срабатывает. Здесь собраны разборы для разработчика, который уже пишет функции и хочет понимать поведение приложения. Выбирайте симптом, воспроизводите его на небольшом примере и оставляйте тест, который заметит повторение ошибки.
Тест не замечает поломку
Сначала определите, какое поведение должно измениться при ошибке. Если подмена не действует, проверьте имя, которое реально использует тестируемый модуль. Если mock принимает любые аргументы, изменившийся интерфейс может остаться незамеченным.
- Почему patch не работает: подменяем имя в месте использования
- autospec в Python: тест замечает изменившуюся сигнатуру
- Protocol в Python: заменить зависимость без наследования
Выбрать monkeypatch или mock в pytest.
Объекты неожиданно делят состояние
Два экземпляра должны иметь независимые данные там, где это предусмотрено моделью. Проверьте вложенные списки и словари, правила сравнения и ключи кэша. Отдельный тест с двумя экземплярами часто показывает проблему яснее длинного сценария.
- default_factory в dataclass: отдельный список для каждого объекта
- frozen dataclass: почему вложенный список всё ещё меняется
- Ключ кэша Python зависит от служебного поля: настроить dataclass
Сравнить dataclass, NamedTuple и обычный класс.
Обёртка изменила интерфейс функции
Декоратор может сохранить результат вычисления, но изменить сигнатуру или привязку метода. Сравните вызов исходной функции и обёртки с позиционными и именованными аргументами; отдельно проверьте неверный вызов.
- Декоратор Python скрыл сигнатуру: что восстанавливает functools.wraps
- partial в классе Python потерял self: когда нужен partialmethod
- Все callbacks Python используют последний ID: как связать значение в цикле
Распаковка аргументов и сигнатуры функций.
Ресурс живёт дольше нужного
Найдите владельца ресурса и момент завершения работы. Закрытие при успешном проходе ещё не покрывает исключение, ранний выход из цикла и несколько открытых объектов. В контрольном примере прервите работу посередине.
- Генератор Python и break: кто закрывает открытый файл
- ExitStack в Python: как закрыть несколько ресурсов при ошибке
- Кэш Python удерживает объекты: разбираем lru_cache на методе
Закрепить нормальный сценарий, границы и исключения в тестах.
Продолжить обучение
Практику объектов, типизации и тестирования можно продолжить в бесплатном курсе Python для продвинутых. Для дальнейшего разбора функций, декораторов и возможностей объектов откройте программу платного курса Python для профессионалов. Выбирайте продолжение по тому, чего сейчас не хватает вашему коду.
Продолжить на практике
- Python для продвинутых: ООП, типизация и тестирование ↗
Практический курс-мост от базового Python к разработке поддерживаемых приложений. Вы разберётесь со структурой пакетов, объектной моделью, современной типизацией и автоматическими тестами, а затем соедините эти инструменты в небольшом приложении с хранением данных и логированием.
