Ruff 0.16.7 виправив небезпечні autofix і прискорив конфігурацію Python-проєктів
Свіжий Ruff коректніше працює з docstring, вкладеними лапками та імпортами, готується до Python 3.15 і швидше розв’язує успадковані налаштування.

Ruff 0.16.7 зосередився на точності автоматичних виправлень, сумісності з Python 3.15 і продуктивності конфігурації. У релізі немає великої зміни командного інтерфейсу, зате є кілька виправлень, які безпосередньо впливають на безпечність запуску ruff check --fix у CI та редакторі.

Autofix не повинен непомітно створювати docstring
Для правила ISC003 з набору flake8-implicit-str-concat виправлення тепер позначається як unsafe, якщо його результатом стає docstring. У Python перший рядковий літерал у модулі, класі або функції має семантичне значення: він потрапляє у __doc__ і може використовуватися генераторами документації, introspection та тестами.
Механічне об’єднання рядків, яке перетворює звичайний літерал на docstring, — це вже не суто форматування. Нова класифікація дозволяє стандартному safe-fix режиму не змінювати поведінку програми без явної згоди розробника.
Імпорти та вкладені format spec
Правило TID254 більше не пропонує виправлення для імпортів із кількома елементами. Такі конструкції складніші за одиночний import: автоматичне перенесення або заміна одного члена може змінити сортування, коментарі чи структуру alias. Лінтер може повідомити проблему, але не повинен удавати, що будь-яке перетворення безпечне.
Парсер виправив роботу з альтернативними вкладеними лапками всередині format spec interpolation. Це крайовий випадок f-string, де лексичний контекст залежить від кількох рівнів лапок та фігурних дужок. Для проєктів, які генерують складні форматовані рядки, зменшується ризик хибної синтаксичної помилки або некоректного перезапису.
Підготовка до Python 3.15
Діагностику ImportCycleError для правила PLW0133 обмежено Python 3.15, де вона актуальна. Ruff також перестав визначати __cached__ для цієї версії мови та більше не рекомендує видалений typing.no_type_check_decorator у правилі UP035. Такі зміни важливі для multi-version проєктів: правило повинно відповідати target version, а не найновішій семантиці без урахування конфігурації.
Типи slice і frozendict тепер розпізнаються як generics у відповідних перевірках. Окремо виправлено повідомлення про конфлікт правил документації D211 і D203, щоб користувач отримував точну підказку, а не плутався в несумісних налаштуваннях.
Нові preview-перевірки
Експериментальне правило RUF077 шукає default values у параметрах, що представляють receiver методу. Ще дві перевірки, RUF039 та RUF055, навчилися розпізнавати re.prefixmatch. Оскільки правила preview, їх не варто безконтрольно вмикати як blocking gate для всього monorepo: спочатку слід оцінити результати та зафіксувати версію.
Швидший старт у великих репозиторіях
Ruff повторно використовує lookup імен у parser interning та швидше розв’язує успадковані конфігурації. Друга оптимізація особливо цікава monorepo з багатьма pyproject.toml і extend: час аналізу складається не лише з обходу AST, а й з побудови ефективних правил для кожного шляху.
- Оновити Ruff на окремій CI-гілці й порівняти набір diagnostics.
- Переглянути unsafe fixes вручну, особливо зміни рядкових літералів та імпортів.
- Явно задати
target-versionдля проєктів, які ще не переходять на Python 3.15. - Preview rules спочатку запускати у report-only режимі.
До shell installer також додано вбудовані контрольні суми архівів. Це покращує перевірку завантаження, однак у production CI надійніше використовувати зафіксований binary, package hash або перевірені artifact attestations.
Висновок: 0.16.7 варто розглядати як реліз якості. Він зменшує ризик надмірно сміливого autofix і уточнює аналіз нових конструкцій Python без штучного розширення набору помилок для старих target versions.
Матеріал перекладено, переказано та доповнено редакцією українською мовою.
Читайте далі — ми вже розбираємо наступну важливу тему.


