Ruff: современный стандарт линтинга и форматирования в Python
Годами стандартный набор для Python-проекта выглядел как зоопарк:
Сейчас уже все используют Ruff — очень быстрый линтер и форматер, написанный на Rust, который создавался с одной целью: быть на порядок лучше существующих инструментов.
Какие у него преимущества?
📦 Тотальная консолидация. Он заменяет собой Flake8, Black, isort, pyupgrade, pydocstyle, autoflake и десятки их плагинов. Один исполняемый файл, одна секция в
⚡️ Феноменальная производительность. Ruff в 10-100 раз быстрее аналогов. Проверка всего codebase CPython занимает у него секунды, а не минуты. Это не просто "удобно", это меняет сам подход к разработке — линтинг становится мгновенной операцией, которую можно безболезненно встроить хоть в pre-commit хук, хоть в CI/CD.
🔧 Автоматическое исправление. Большинство проблем Ruff может исправить сам с помощью флага
🧩 Простая интеграция. Первоклассная поддержка VS Code, pre-commit хуков и GitHub Actions.
Хотите пощупать, не ставя локально? Для этого есть официальная песочница.
Начать использовать — элементарно:
Добавляем в
После этого можно смело удалять старые зависимости из проекта.
Официальная документация 👈🏻
#тулбокс
Годами стандартный набор для Python-проекта выглядел как зоопарк:
Black
для форматирования, isort
для импортов, Flake8
с десятком плагинов (bugbear
, bandit
, annotations
...) для статического анализа. Это работало, но было медленно и требовало сложной настройки.Сейчас уже все используют Ruff — очень быстрый линтер и форматер, написанный на Rust, который создавался с одной целью: быть на порядок лучше существующих инструментов.
Какие у него преимущества?
📦 Тотальная консолидация. Он заменяет собой Flake8, Black, isort, pyupgrade, pydocstyle, autoflake и десятки их плагинов. Один исполняемый файл, одна секция в
pyproject.toml
. Меньше зависимостей, проще конфигурация, нет конфликтов.⚡️ Феноменальная производительность. Ruff в 10-100 раз быстрее аналогов. Проверка всего codebase CPython занимает у него секунды, а не минуты. Это не просто "удобно", это меняет сам подход к разработке — линтинг становится мгновенной операцией, которую можно безболезненно встроить хоть в pre-commit хук, хоть в CI/CD.
🔧 Автоматическое исправление. Большинство проблем Ruff может исправить сам с помощью флага
--fix
. Автоматическое удаление неиспользуемых импортов, исправление стиля, обновление синтаксиса — всё из коробки.🧩 Простая интеграция. Первоклассная поддержка VS Code, pre-commit хуков и GitHub Actions.
"Ruff настолько быстр, что я иногда намеренно добавляю баг в код, просто чтобы убедиться, что он действительно работает и проверяет его".
— Себастьян Рамирес, создатель FastAPI
Хотите пощупать, не ставя локально? Для этого есть официальная песочница.
Начать использовать — элементарно:
pip install ruff
Добавляем в
pyproject.toml
конфиг, который покроет 95% потребностей среднего проекта:[tool.ruff]
# Выбираем правила: E, W (pycodestyle), F (Pyflakes), I (isort), B (flake8-bugbear)
select = ["E", "F", "I", "W", "B"]
line-length = 88
# Добавляем авто-фикс для неиспользуемых импортов
unfixable = ["F841"]
[tool.ruff.format]
# Включаем встроенный форматер, аналог Black
quote-style = "double"
После этого можно смело удалять старые зависимости из проекта.
Официальная документация 👈🏻
#тулбокс
👍5🔥2 2⚡1👏1🙏1
По теме ИИ сейчас тонны каналов, легко закопаться. Чтобы не искать по одному, вот вам тематическая подборка
Что в ней можно найти?
Возможно, вам пригодится
→ Посмотреть подборку
Please open Telegram to view this post
VIEW IN TELEGRAM
Пятничный сеанс экзорцизма в рубрике #код_курильщика объявляется открытым вот с таким 🤬 из интернетов:
Что эта дичь вообще делает?
Если отмыть код от страданий, то это, по сути, фабрика объектов. Она берёт список каких-то
1. Смотрит его тип в
2. По этому типу через пару словарей находит нужный класс (например,
3. Создаём экземпляр этого класса, скармливая ему весь
4. Все созданные объекты запихивает в новый список
Задача тривиальная. Реализация — специфичная🤪
Почему это преступление против человечности:
1️⃣ Одержимость однострочниками. Классическая ошибка, когда "компактно" путают с "хорошо".
2️⃣ Немыслимая вложенность. Чтобы понять, какой класс создаётся, нужно совершить ментальную акробатику и пройти по цепочке из трёх словарей. Дебажить такое — чистое страдание.
3️⃣ Вероятные баги. Судя по всему,
Комментарий
Это идеальный пример того, как в погоне за "компактностью" полностью убивается главный принцип Python — читаемость. Zen of Python вышел из чата и хлопнул дверью.
А как надо было?
Да просто разбить это на несколько понятных строк. Превращаем чудовище в нормальный, читаемый код, который не заставит ваших коллег вас ненавидеть.
Что мы получили:
- Читаемость. Код читается как проза, а не как шифровка.
- Отлаживаемость. Можно поставить
- Надёжность. Используем
Ставьте👍 , если сразу поняли, что изначальный код делает.
pubcls = main.__all__["publication"]
res = [ main.__all__[pubcls._type_classes[unit["unitType"]]](unit) for unit in
units if unit in pubcls._type_classes and pubcls._type_classes[unit] in main.__all__] # python moment©
Что эта дичь вообще делает?
Если отмыть код от страданий, то это, по сути, фабрика объектов. Она берёт список каких-то
units
(похоже, словарей с данными), и для каждого из них:1. Смотрит его тип в
unit["unitType"]
.2. По этому типу через пару словарей находит нужный класс (например,
Article
или NewsItem
).3. Создаём экземпляр этого класса, скармливая ему весь
unit
.4. Все созданные объекты запихивает в новый список
res
.Задача тривиальная. Реализация — специфичная
Почему это преступление против человечности:
unit
— это словарь, и его пытаются использовать как ключ. Либо это какой-то кастомный hashable-объект, что делает код ещё более неочевидным, либо автор просто... творит дичь.Комментарий
# python moment©
— это самоирония 80-го уровня. Человек создал чудовище, прекрасно это осознал, но все равно оставил его жить.Это идеальный пример того, как в погоне за "компактностью" полностью убивается главный принцип Python — читаемость. Zen of Python вышел из чата и хлопнул дверью.
А как надо было?
Да просто разбить это на несколько понятных строк. Превращаем чудовище в нормальный, читаемый код, который не заставит ваших коллег вас ненавидеть.
def create_objects_from_data(units: list) -> list:
"""
Создаёт список объектов из списка словарей с данными.
"""
# Достаём нужные "реестры" один раз
publication_registry = main.__all__["publication"]
class_name_map = publication_registry._type_classes
result = []
for unit_data in units:
unit_type = unit_data.get("unitType")
if not unit_type:
continue # Пропускаем данные без типа
class_name = class_name_map.get(unit_type)
if not class_name:
continue # Пропускаем неизвестные типы
target_class = main.__all__.get(class_name)
if not target_class:
continue # Пропускаем, если класс не найден
result.append(target_class(unit_data))
return result
Что мы получили:
- Читаемость. Код читается как проза, а не как шифровка.
- Отлаживаемость. Можно поставить
breakpoint
на любой строке и посмотреть, что лежит в unit_type
, class_name
или target_class
.- Надёжность. Используем
.get()
для безопасной работы со словарями, избегая KeyError
.Ставьте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👨💻2⚡1👍1🙏1
🤯 API для ChatGPT нахаляву?
Как насчет OpenAI-совместимого API, которое работает от вашей подписки ChatGPT Plus и не требует покупки токенов? Да, так можно было.
Наткнулся на проект
Что это дает на выходе:
1️⃣ Совместимость: Эндпоинты, идентичные OpenAI и Ollama. Можно подключить любой привычный клиент или библиотеку.
2️⃣ Доступ к gpt-5: Можно дергать последнюю модель программно, как будто у вас есть API-ключ.
3️⃣ Фичи: Поддерживается vision, tool calling и даже "усилия на размышление" (reasoning effort) — можно подкрутить, насколько сильно модель будет "думать".
Конечно, есть нюансы:
1. Нужна платная подписка ChatGPT Plus/Pro. Халява не совсем халява.
2. Рейт-лимиты будут ниже, чем у полноценного API. Для личных пет-проектов — топ, для прода — вряд ли.
3. Проект, разумеется, не аффилирован с OpenAI и существует на свой страх и риск, это серая зона.
Устанавливается через Homebrew, Docker или просто как python-скрипт.
#годный_опенсорс
Как насчет OpenAI-совместимого API, которое работает от вашей подписки ChatGPT Plus и не требует покупки токенов? Да, так можно было.
Наткнулся на проект
ChatMock
— локальный прокси-сервер, который делает ровно это. Вы логинитесь через свой аккаунт, а он прокидывает запросы на настоящий бэкенд ChatGPT.Что это дает на выходе:
Конечно, есть нюансы:
1. Нужна платная подписка ChatGPT Plus/Pro. Халява не совсем халява.
2. Рейт-лимиты будут ниже, чем у полноценного API. Для личных пет-проектов — топ, для прода — вряд ли.
3. Проект, разумеется, не аффилирован с OpenAI и существует на свой страх и риск, это серая зона.
Устанавливается через Homebrew, Docker или просто как python-скрипт.
#годный_опенсорс
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - RayBytes/ChatMock: Access OpenAI models programmatically through your ChatGPT subscription.
Access OpenAI models programmatically through your ChatGPT subscription. - RayBytes/ChatMock
🔥3👍1 1