Ruff 0.17 и uv 0.13.6: Python 3.11 по умолчанию, подписанные бинарники и меньше памяти

26 октября 2026 года Astral выпустила Ruff 0.17.3 и uv 0.13.6. Сами по себе это обычные плановые выпуски, но вместе с ними до многих доедет и ветка Ruff 0.17, начатая 9 октября. В ней поменялись настройки по умолчанию, а uv в новой версии ставит свежие сборки CPython и меньше расходует память на больших проектах.

Если Ruff и uv стоят у вас в CI, в pre-commit или на сервере, где собираются проекты, после обновления может поменяться вывод проверок. Ниже то, что стоит знать заранее.

Ruff 0.17 считает целевой версией Python 3.11

Если в проекте не задан target-version в настройках Ruff и нет requires-python в pyproject.toml, Ruff 0.17 по умолчанию проверяет код под Python 3.11, а не под 3.10, как раньше. При поиске синтаксических ошибок без заданной версии он теперь ориентируется на Python 3.15 вместо 3.14.

Для проектов, которые ещё живут на Python 3.10 (его поддержка уже закончилась), версию лучше прописать явно. Иначе правила pyupgrade начнут предлагать синтаксис, которого 3.10 не понимает. Достаточно одной из двух строк:

[project]
requires-python = ">=3.10"

# или только для Ruff
[tool.ruff]
target-version = "py310"

Что ещё поменялось в Ruff 0.17 по умолчанию

  • Правила flake8-datetimez DTZ001, DTZ005, DTZ006, DTZ007, DTZ011, DTZ012 и DTZ901 больше не включены по умолчанию. Если они нужны, их придётся включить в конфиге самому.
  • Зато по умолчанию включено F406: оно ловит from module import * внутри функции, а это в Python синтаксическая ошибка.
  • В обычном выводе (формат full) теперь всегда видны небезопасные исправления и подсказки, которые нужно проверить руками, какой бы ни была настройка unsafe-fixes. Применяются они по-прежнему только по явному разрешению.
  • В JUnit-отчёте у элементов testsuite атрибут disabled заменён на skipped. Если CI разбирает этот отчёт своим скриптом, стоит его проверить.
  • ICN001 теперь считает import datetime as dt общепринятым сокращением.
  • Переменные-заглушки с подчёркиванием в начале распознаются и с именами не на латинице, например _次. Ruff перешёл на данные Unicode 17.
  • Правила TID254 и TID255 про ленивый импорт, который появился в Python 3.15, вышли из режима preview и стали обычными.

ruff-lsp удалён, а сборка из conda-forge больше не тянет Python

Старый языковой сервер ruff-lsp, который объявили устаревшим ещё в Ruff 0.9.5, окончательно удалён. Расширение Ruff для VS Code теперь всегда работает со встроенным сервером, а настройка ruff.nativeServer просто игнорируется. Если в другом редакторе до сих пор прописан ruff-lsp, как перейти, рассказано в руководстве по миграции.

Сборка Ruff из conda-forge больше не зависит от Python. В ней появились платформы linux-riscv64, win-arm64 и linux-ppc64le и автодополнение для оболочек, но python -m ruff и import ruff там больше не работают: запускать нужно просто ruff из PATH. Установку из PyPI и через отдельный установщик это не затрагивает.

Бинарники Ruff теперь подписаны

Начиная с 0.17.0, исполняемые файлы Ruff для macOS и Windows и колёса ruff подписаны. На macOS это сертификат Apple Developer ID с нотаризацией в Apple, на Windows подпись Authenticode с меткой времени через Azure Artifact Signing. Так можно проверить, кто выпустил файл и не подменили ли его, разрешить запуск по издателю в корпоративных политиках, а антивирусы должны реже ругаться на ложные срабатывания.

Ruff 0.17.1, 0.17.2 и 0.17.3: исправления и скорость

Следующие выпуски небольшие. В 0.17.2 у правила PLR2004 (магические числа в сравнениях) появился настраиваемый список разрешённых значений, а исправления PLR5501, PLW0120 и UP035 теперь считаются небезопасными, если при этом пропадают комментарии. В 0.17.3 правило UP032 перестало ошибаться при переделке format() в f-строки, ruff format буферизует вывод, а разбор идентификаторов и ключевых слов стал быстрее. В режиме preview добавились проверки unnecessary-regular-expression-compile и shared-clock-mock.

uv 0.13.6: CPython 3.15.2 и меньше памяти

uv 0.13.6 умеет ставить CPython 3.11.18, 3.12.16, 3.13.18, 3.14.10 и 3.15.2, то есть выпуски от 26 октября, где ssl сам блокирует ключи eMudhra. Если Python на сервере ставился через uv, после обновления самого uv его стоит подтянуть командой uv python upgrade. Она теперь не теряет free-threaded и другие нестандартные сборки.

Большая часть остальных изменений про скорость. Заметно снижено пиковое потребление памяти при разборе зависимостей в больших рабочих пространствах, при uv lock и обновлении крупных проектов. uv export и uv pip compile быстрее пишут вывод, когда он перенаправлен в файл, а скрипты PEP 723 без зависимостей запускаются в уже готовом окружении вместо нового.

Из исправлений важнее всего одно: uv run --active --script и uv sync --active --script больше не удаляют каталог, если он не является виртуальным окружением. Ещё uv теперь подставляет AMD64 в platform_machine при разборе зависимостей для 64-битной Windows.

Как обновить Ruff и uv

Если uv ставился официальным установщиком, он обновляет себя сам. Ruff, поставленный как инструмент uv, обновляется отдельно, а в pre-commit версию хука поднимает pre-commit autoupdate:

uv self update
uv tool upgrade ruff
uv python upgrade

# если ставили через pip
python -m pip install -U uv ruff

# версия хука ruff в .pre-commit-config.yaml
pre-commit autoupdate

Главное в этой паре выпусков: Ruff 0.17 по умолчанию проверяет код под Python 3.11, отключил часть правил DTZ, всегда показывает небезопасные исправления и окончательно попрощался с ruff-lsp, а uv 0.13.6 ставит свежие CPython и бережнее обходится с памятью. Перед обновлением в CI стоит прописать requires-python или target-version, если проект ещё на 3.10, и проверить разбор JUnit-отчёта.

Источники и ссылки


Комментарии загружаются…