Лучшие практики Python 2026: 20 правил для кода в эпоху ИИ
В 2026 году заметная часть Python-кода в командах появляется из Copilot, Claude Code, Cursor и других ассистентов. Код пишется быстрее, и плохие привычки обходятся дороже: агент охотно размножит неудачный паттерн по всему репозиторию, предложит несуществующую библиотеку или напишет код, который никто в команде толком не понимает.
Ниже 20 практик, которые помогают держать качество под контролем. Часть касается инструментов, часть процессов, и почти все одинаково полезны для кода, написанного руками, и для кода, который сгенерировала модель.
1. Управляйте проектом через uv
uv от Astral заменил связку pip, venv, pip-tools и pyenv одной быстрой утилитой. Он ставит нужную версию Python, создает окружение, ведет pyproject.toml и lock-файл. При работе с ИИ это особенно удобно: агент запускает команды через uv run и всегда попадает в правильное окружение, а lock-файл гарантирует одинаковые версии пакетов у вас, в CI и у ассистента.
2. Один инструмент для линтинга и форматирования
Ruff проверяет и форматирует код за доли секунды, поэтому его можно запускать на каждое сохранение и каждый коммит. Включите правила pyupgrade (UP), bugbear (B) и сортировку импортов (I): они ловят устаревший синтаксис и типичные ошибки, которые модели часто приносят из старых обучающих данных. Споры о стиле на ревью пропадают сами собой.
[tool.ruff.lint]
select = [“E”, “F”, “I”, “B”, “UP”, “SIM”, “RUF”]
3. Аннотации типов и строгая проверка в CI
Типы стали главным способом объяснить намерение и человеку, и модели. Ассистент, который видит сигнатуру def charge(order: Order, *, idempotency_key: str) -> Receipt, пишет заметно более точный код, чем по голому def charge(order, key). Проверяйте типы в CI с помощью mypy или pyright в строгом режиме. Быстрый ty от Astral пока в бете, и его стоит попробовать на больших кодовых базах, где mypy работает минутами.
4. Современный синтаксис типов
Пишите X | None вместо Optional[X] и list[int] вместо List[int], используйте оператор type для псевдонимов и встроенный синтаксис дженериков из Python 3.12. Код становится короче, а ассистенты реже тащат в проект устаревшие импорты из typing.
5. Неизменяемые структуры данных
Для внутренних объектов подойдет dataclass с параметрами frozen=True и slots=True. Неизменяемый объект нельзя случайно поменять в другом месте программы, его безопасно передавать между потоками, и он экономит память. Словари с произвольными ключами оставьте для действительно динамических данных.
6. Валидация на границах системы
Все, что приходит извне, проверяйте сразу на входе: HTTP-запросы, файлы, переменные окружения и особенно ответы языковых моделей. LLM может вернуть JSON с лишним полем, строкой вместо числа или выдуманным значением. Pydantic v2 превращает такой ответ в типизированный объект или падает с понятной ошибкой, и дальше по коду перепроверять уже ничего не нужно.
7. Тест раньше генерации
Самый надежный способ получить от ИИ правильный код: сначала написать тест. Тест фиксирует, какое поведение считается правильным, а агент итерирует, пока pytest не станет зеленым. Без теста вы получаете правдоподобно выглядящий код и узнаете о проблеме уже в продакшене.
8. Property-based тесты для сгенерированного кода
Модели хорошо проходят примеры, которые сами же и придумали. Hypothesis генерирует сотни случайных входов, включая пустые списки, отрицательные числа и странные строки, и находит граничные случаи, о которых не подумали ни вы, ни ассистент.
9. Маленькие функции с явными зависимостями
Функцию на 20 строк, которая получает все нужное через параметры, легко читать, тестировать и переписывать. Для ИИ это тоже важно: у ассистента ограниченный контекст, и небольшой самодостаточный фрагмент он меняет аккуратнее, чем модуль на 2000 строк, где все связано со всем. Передавайте клиенты базы данных и HTTP через аргументы, тогда в тестах их легко подменить.
10. Файл с правилами проекта для ассистентов
Заведите в корне репозитория AGENTS.md или CLAUDE.md: версия Python, команды для тестов и линтера, принятые соглашения, запреты. Агент читает этот файл в начале каждой сессии, и повторять одни и те же инструкции больше не придется. Держите файл коротким, до сотни строк, подробности выносите в документацию.
11. Читайте каждый сгенерированный дифф
Код, который вы не понимаете, становится долгом, даже если тесты проходят. Перед коммитом прочитайте изменения целиком и спросите себя, смогли бы вы объяснить их коллеге. Особенно внимательно смотрите на обработку ошибок: модели любят молча проглатывать исключения, чтобы тест прошел.
12. Проверяйте каждую новую зависимость
ИИ-ассистенты иногда предлагают пакеты, которых не существует, и злоумышленники уже регистрируют такие имена в PyPI с вредоносным кодом. Эту атаку называют slopsquatting. Прежде чем добавить пакет, убедитесь, что он существует, поддерживается и им пользуются. Регулярно запускайте pip-audit и держите обновления под контролем через Dependabot или Renovate.
13. Секреты вне кода и вне промптов
Ключи API, пароли и токены храните в переменных окружения или менеджере секретов, а .env добавьте в .gitignore. Следите, чтобы секреты не попадали в контекст ассистента: все, что прочитала модель, может всплыть в логах, сгенерированном коде или ответе. Для настроек удобен pydantic-settings, который заодно проверит, что все нужные переменные заданы.
14. Шаблонные строки для безопасной подстановки
В Python 3.14 появились t-строки (PEP 750). Внешне они похожи на f-строки, но возвращают объект Template вместо готовой строки, и обрабатывающая библиотека сама решает, как экранировать подставленные значения. Для SQL, HTML и shell-команд это защита от инъекций, которые модели регулярно допускают, когда собирают запросы через f-строки.
15. asyncio с TaskGroup и таймаутами
Приложения с ИИ много ждут: ответов LLM API, векторных баз, внешних сервисов. Для параллельных запросов используйте asyncio.TaskGroup, который корректно отменяет остальные задачи при ошибке, и всегда задавайте таймауты. Повторные попытки при сетевых сбоях удобно делать через tenacity с экспоненциальной задержкой.
16. Структурированные логи вместо print
print не показывает уровень, время и контекст, его нельзя отфильтровать. Используйте logging или structlog и пишите логи в JSON с полями вроде request_id, названия модели и числа токенов. Когда агент или LLM-пайплайн ведет себя странно, разобраться получится только по таким логам.
17. Конкретные исключения
Голый except: и конструкция except Exception: pass прячут ошибки. Ловите только те исключения, которые умеете обработать, и всегда логируйте контекст. Для параллельных задач пригодятся ExceptionGroup и except*, с их помощью можно разобрать сразу несколько ошибок из TaskGroup.
18. Профилируйте, прежде чем оптимизировать
Модели охотно предлагают оптимизации на глаз. Сначала измерьте: cProfile и py-spy покажут, где на самом деле уходит время. В Python 3.15 в стандартную библиотеку добавлен семплирующий профилировщик, который подключается к уже запущенному процессу без изменений в коде.
19. Следите за версией Python
Python 3.14 официально поддерживает сборку без GIL. Для CPU-нагруженного кода на потоках это дает настоящий параллелизм, хотя к такой сборке готовы пока не все библиотеки с C-расширениями. Релиз Python 3.15 запланирован на 9 октября 2026 года: в нем появились явные ленивые импорты (PEP 810), которые ускоряют запуск CLI-утилит, а UTF-8 стал кодировкой по умолчанию. Обновляйтесь регулярно и проверяйте, под какую версию пишет код ассистент.
20. Документация для людей и моделей
Docstring, README и описание архитектуры теперь читают и коллеги, и ассистенты. Пишите в docstring, зачем нужна функция и какие у нее ограничения, пересказ очевидного кода пропускайте. Хорошая документация в репозитории напрямую влияет на качество того, что сгенерирует модель.
Итог
ИИ ускорил написание кода, и узким местом стала проверка. Инструменты из этого списка (uv, Ruff, проверка типов, pytest с Hypothesis, Pydantic) берут на себя рутинный контроль. За вами остаются решения, которые нельзя делегировать: чтение диффов, выбор зависимостей и понимание того, что делает код. Начните с uv, Ruff и файла AGENTS.md, это займет один вечер и окупится уже на следующей неделе.
Оригинал статьи с оглавлением на uproger.com. Больше материалов по Python в разделе Python на uproger.