Состоялся релиз pyauto-desktop — современной замены PyAutoGUI с поддержкой HiDPI
Если автоматизировали десктоп через PyAutoGUI — знаете боль: скрипт ломается при смене разрешения, на 4K всё едет, мультимонитор не работает. Новая библиотека решает это.
Отличия от PyAutoGUI
🔘 Автоскейлинг координат и изображений через Session-логику
🔘 До 5x быстрее (mss + Pyramid Template Matching + кэширование)
🔘 locateAny / locateAll из коробки вместо циклов
🔘 Встроенный GUI Inspector: снипы, редактор, генерация кода
🔘 Бэкенд: opencv-python, mss, pynput
Из комментариев
📎 Код на GitHub, на видео демо
@zen_of_python
Если автоматизировали десктоп через PyAutoGUI — знаете боль: скрипт ломается при смене разрешения, на 4K всё едет, мультимонитор не работает. Новая библиотека решает это.
Отличия от PyAutoGUI
Из комментариев
Session management, который абстрагирует DPI — это то, чего не хватало PyAutoGUI
@zen_of_python
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Pyrethrin — exhaustive error handling для Python, теперь с обёртками для pandas/numpy/FastAPI
Библиотека, которая привносит Rust-стиль обработки ошибок в Python: нельзя проигнорировать исключение, компилятор (ну, рантайм) заставит обработать все варианты.
Новое в v0.2.0: Shields
Drop-in замены для библиотек с явным объявлением исключений:
➡️ Как узнали какие исключения бросает pd.read_csv?
Автор написал отдельный инструмент Arbor для статического анализа. Для read_csv он прошёл 5,623 функции и нашёл 1,881 raise-statement — 35 типов исключений. Топ: ValueError (442), TypeError (227), NotImplementedError (87).
➡️ Философия
🔘 Нет unwrap() — никаких escape hatch, обрабатывай всё
🔘 Проверка exhaustiveness в момент вызова, не импорта
🔘 Работает с нативным match-case (Python 3.10+)
📎 GitHub, Arbor, PyPI
@zen_of_python
Библиотека, которая привносит Rust-стиль обработки ошибок в Python: нельзя проигнорировать исключение, компилятор (ну, рантайм) заставит обработать все варианты.
Новое в v0.2.0: Shields
Drop-in замены для библиотек с явным объявлением исключений:
# Было — исключения неявные
import pandas as pd
df = pd.read_csv("data.csv")
# Стало — нужно обработать все возможные ошибки
from pyrethrin.shields import pandas as pd
from pyrethrin import match, Ok
result = match(pd.read_csv, "data.csv")({
Ok: lambda df: process(df),
OSError: lambda e: log_error("File not found", e),
pd.ParserError: lambda e: log_error("Invalid CSV", e),
# ... остальные
})
Автор написал отдельный инструмент Arbor для статического анализа. Для read_csv он прошёл 5,623 функции и нашёл 1,881 raise-statement — 35 типов исключений. Топ: ValueError (442), TypeError (227), NotImplementedError (87).
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2👍1
PCA — стандартный способ уменьшить размерность данных (1000 фичей → 50). Главная боль: нужно выбирать
🔘 Сама определяет, где заканчивается сигнал и начинается шум
🔘 Отрезает лишнее без ручного подбора
🔘 Один проход вместо кросс-валидации
➡️ Бонус для больших данных
PCA требует центрирования матрицы. Если матрица разреженная (sparse), центрирование делает её плотной — память взрывается. Библиотека умеет считать PCA на sparse-матрицах без этой проблемы.
Использование
Drop-in замена sklearn — работает в Pipeline.
📎 Код на GitHub, доки
@zen_of_python
n_components — сколько компонент оставить. Обычно либо перебор через GridSearch, либо «ну возьму 50, должно хватить». Библиотека randomized-svd решает проблему автоматически.PCA требует центрирования матрицы. Если матрица разреженная (sparse), центрирование делает её плотной — память взрывается. Библиотека умеет считать PCA на sparse-матрицах без этой проблемы.
Использование
from randomized_svd import RandomizedSVD
rsvd = RandomizedSVD(n_components=100, rank_selection='auto')
X_reduced = rsvd.fit_transform(X) # сама выберет сколько компонент нужно
Drop-in замена sklearn — работает в Pipeline.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤝1
calgebra — алгебра множеств для календарей в Python
Есть задача: найти время, когда вся команда свободна, с учётом Google Calendar, .ics файлов и рабочих часов. Обычно это превращается в ад из циклов и условий. Новый проект решает это через операторы множеств — как будто пишешь SQL, но для временных интервалов.
Как это работает
Операторы:
➡️ Чем отличается от аналогов
🔘 icalendar / ics.py — только парсят .ics, calgebra добавляет запросы и композицию
🔘 gcsa — CRUD для Google Calendar, calgebra даёт set-операции поверх
🔘 dateutil.rrule — генерирует повторения, но не умеет пересекать/вычитать таймлайны
➡️ Фичи
🔘 Поддержка RFC 5545 (повторяющиеся события)
🔘 Фильтры по длительности, метаданным, кастомным атрибутам
🔘 Импорт/экспорт .ics через file_to_timeline и timeline_to_file
🔘 Интеграция с Google Calendar
🔘 Type hints для IDE и агентов
➡️ Кому пригодится
Разработчикам scheduling-фич, интеграций с календарями, систем проверки availability. Автор отмечает, что API удобен для ИИ-агентов благодаря композируемости и типизации.
📎 Код на GitHub, на видео демо работы ИИ-агента с calgebra
@zen_of_python
Есть задача: найти время, когда вся команда свободна, с учётом Google Calendar, .ics файлов и рабочих часов. Обычно это превращается в ад из циклов и условий. Новый проект решает это через операторы множеств — как будто пишешь SQL, но для временных интервалов.
Как это работает
from calgebra import day, time_of_day, HOUR
# Рабочие часы
work_hours = day("weekday") & time_of_day(start=9*HOUR, duration=8*HOUR)
# Календари команды
team = alice | bob | charlie
# Свободное время для встречи от 2 часов
free = (work_hours - team).filter(hours >= 2)
Операторы:
| (объединение), & (пересечение), - (разность), ~ (дополнение). Ленивые вычисления — выражение выполняется только при слайсинге.Разработчикам scheduling-фич, интеграций с календарями, систем проверки availability. Автор отмечает, что API удобен для ИИ-агентов благодаря композируемости и типизации.
@zen_of_python
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤1
Forwarded from Метод утёнка
Если взять конкретный язык, то всё может быть ещё хуже.
В Python, например, тип
🔘 PyObject header — счётчик ссылок + указатель на тип (~16 байт на 64-бит)
🔘 PyLongObject — структура для хранения целых чисел произвольной длины (~12 байт дополнительно)
Можно проверить самостоятельно:
Почему так расточительно?
Python оптимизирован для удобства и гибкости, а не для экономии памяти. Зато True и False — синглтоны (существует только по одному экземпляру каждого), так что в реальных программах это не создаёт проблем.
Для компактного хранения множества булевых значений используют
@devs_books
В Python, например, тип
bool наследуется от int, поэтому True и False — это полноценные объекты — целые числа. Каждый объект в CPython несёт накладные расходы:Можно проверить самостоятельно:
import sys
print(sys.getsizeof(True)) # 28
print(sys.getsizeof(False)) # 28
Почему так расточительно?
Python оптимизирован для удобства и гибкости, а не для экономии памяти. Зато True и False — синглтоны (существует только по одному экземпляру каждого), так что в реальных программах это не создаёт проблем.
Для компактного хранения множества булевых значений используют
numpy.array с dtype=bool (1 байт на значение) или битовые массивы.@devs_books
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4❤2
Один начинающий программист читал Effective Python и завис на первой главе про форматирование строк. Искал что-то типа Pythex, но для f-strings — не нашёл. Попросил Claude сделать HTML-приложение по спеке.
Получился вот такой сайт с визуализацией форматирования строк в питоне.
Format spec mini-language выглядит так:
И когда видишь
Примеры того, что можно форматировать
Выравнивание, заполнение, знаки, разделители тысяч, точность — всё в одной строке.
📎 Код на GitHub, демо на сайте
@zen_of_python
Получился вот такой сайт с визуализацией форматирования строк в питоне.
Format spec mini-language выглядит так:
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
И когда видишь
f'{value:0>10.2f}' — не сразу понятно, что где. Визуализатор разбирает строку на части и показывает, за что отвечает каждый символ.
Примеры того, что можно форматировать
f'{3.14159:.2f}' # → '3.14'
f'{"test":#>10}' # → '######test'
f'{12345:,}' # → '12,345'
f'{-42:010}' # → '-000000042'Выравнивание, заполнение, знаки, разделители тысяч, точность — всё в одной строке.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤🔥4❤4
dbgpu — база 2000+ видеокарт с TechPowerUp в Python
Python-пакет для работы со спецификациями GPU. Парсит TechPowerUp, отдаёт структурированные данные. MIT лицензия.
Установка и использование
Поддерживает NVIDIA, AMD, Intel, ATI, 3dfx, Matrox — всё, что есть на TechPowerUp.
Внутри ~50 полей на карту: архитектура, техпроцесс (нм), транзисторы, die size, частоты (base/boost/memory), память (тип, объём, шина, bandwidth), шейдерные юниты, TMU, ROP, SM, tensor/RT cores, кэши L1/L2, TDP, размеры платы, разъёмы питания и видеовыходы, версии API (DirectX, OpenGL, Vulkan, OpenCL, CUDA, Shader Model), производительность FP16/FP32/FP64.
В релизах на GitHub лежат готовые JSON/CSV/PKL. Последний полный билд — декабрь 2025.
Можно спарсить свежую базу самостоятельно:
Rate limit 4 req/min. Полный проход по всем GPU — 10+ часов.
📎 Код на GitHub
@zen_of_python
Python-пакет для работы со спецификациями GPU. Парсит TechPowerUp, отдаёт структурированные данные. MIT лицензия.
Установка и использование
pip install dbgpu
dbgpu lookup "GeForce RTX 4090"
from dbgpu import GPUDatabase
db = GPUDatabase.default()
spec = db["GeForce RTX 4090"]
# или нечёткий поиск: db.search("4090")
Поддерживает NVIDIA, AMD, Intel, ATI, 3dfx, Matrox — всё, что есть на TechPowerUp.
Внутри ~50 полей на карту: архитектура, техпроцесс (нм), транзисторы, die size, частоты (base/boost/memory), память (тип, объём, шина, bandwidth), шейдерные юниты, TMU, ROP, SM, tensor/RT cores, кэши L1/L2, TDP, размеры платы, разъёмы питания и видеовыходы, версии API (DirectX, OpenGL, Vulkan, OpenCL, CUDA, Shader Model), производительность FP16/FP32/FP64.
В релизах на GitHub лежат готовые JSON/CSV/PKL. Последний полный билд — декабрь 2025.
Можно спарсить свежую базу самостоятельно:
pip install dbgpu[build]
dbgpu build --manufacturer NVIDIA --start-year 2023
Rate limit 4 req/min. Полный проход по всем GPU — 10+ часов.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
Библиотеку packaging ускорили в 3 раза
packaging — это библиотека, которую использует почти всё в Python-экосистеме для работы с версиями и зависимостями. Она встроена в pip, а pip встроен в Python — так что это буквально самая распространённая сторонняя библиотека в мире.
Когда pip резолвит зависимости, он создаёт миллионы объектов Version и SpecifierSet. Буквально миллионы — в бенчмарке, который использовал автор, было 4,8 миллиона. Каждый раз парсится регулярка, создаются объекты, сравниваются версии. Это занимает время.
➡️ Что сделал мейнтейнер библиотеки?
Взял новый статистический профайлер из Python 3.15, прогнал через него реальные данные (все версии когда-либо загруженные на PyPI) и нашёл узкие места.
Оказалось, что регулярка — не главная проблема. Основное время уходило на:
🔘 Создание лишних объектов (NamedTuple внутри Version — убрал, +20%)
🔘 Дублирование работы (Version создавался дважды в одном месте — исправил, +37%)
🔘 Неоптимальный код (генераторы вместо map, singledispatch вместо if — переписал)
Результат:
🔘 Чтение версий: 19,6 сек → 9,9 сек (2x)
🔘 Проверка requires-python: 105 сек → 33,9 сек (3x)
🔘 Количество создаваемых Version в pip: 4,8M → 400K
Все исправления будут в версии 26, уже вышла rc1, финальный релиз обещают на днях.
@zen_of_python
packaging — это библиотека, которую использует почти всё в Python-экосистеме для работы с версиями и зависимостями. Она встроена в pip, а pip встроен в Python — так что это буквально самая распространённая сторонняя библиотека в мире.
Когда pip резолвит зависимости, он создаёт миллионы объектов Version и SpecifierSet. Буквально миллионы — в бенчмарке, который использовал автор, было 4,8 миллиона. Каждый раз парсится регулярка, создаются объекты, сравниваются версии. Это занимает время.
Взял новый статистический профайлер из Python 3.15, прогнал через него реальные данные (все версии когда-либо загруженные на PyPI) и нашёл узкие места.
Оказалось, что регулярка — не главная проблема. Основное время уходило на:
Результат:
Все исправления будут в версии 26, уже вышла rc1, финальный релиз обещают на днях.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤🔥6
Niquests — это современная версия requests: быстрее и с поддержкой новых фич протокола HTTP/2 и HTTP/3. Автор позиционирует вообще как самую быструю и показывает бенчмарки с обгоном httpx и aiohttp по количеству запросов в секунду.
Основная фишка — вместо кучи соединений используется настоящий HTTP/2+ multiplexing — много запросов через несколько установленных коннектов. На больших нагрузках это решает. По сути это то, как делают запросы современные браузеры.
Drop-in замена для requests — тот же API, просто меняешь импорт. При этом автоматически работает HTTP/1.1, HTTP/2 и HTTP/3 — либа выбирает лучший протокол сама. Есть Async, WebSocket через HTTP/1, 2, 3, DNS‑over‑HTTPS, DNSSEC и поддержка нового питона без GIL.
Если просто иногда дёргаете один‑два API — можно не париться и оставаться на той либе, что сейчас используете. Если хотя бы сотни запросов, то можно попробовать получить прирост скорости просто заменой импорта.
📎 Код на GitHub, на видео тот самый бенчмарк
@zen_of_python
Основная фишка — вместо кучи соединений используется настоящий HTTP/2+ multiplexing — много запросов через несколько установленных коннектов. На больших нагрузках это решает. По сути это то, как делают запросы современные браузеры.
Drop-in замена для requests — тот же API, просто меняешь импорт. При этом автоматически работает HTTP/1.1, HTTP/2 и HTTP/3 — либа выбирает лучший протокол сама. Есть Async, WebSocket через HTTP/1, 2, 3, DNS‑over‑HTTPS, DNSSEC и поддержка нового питона без GIL.
Если просто иногда дёргаете один‑два API — можно не париться и оставаться на той либе, что сейчас используете. Если хотя бы сотни запросов, то можно попробовать получить прирост скорости просто заменой импорта.
@zen_of_python
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🆒9⚡1🔥1
На Reddit обсудили, с какими инструментами питонисты стартуют новые проекты в 2026. В треде 170+ комментариев, подведу краткие итоги.
А вот в тайп-чекинге единства нет. Одни ждут pyright, другие пробуют ty или pyrefly. Ruff сам по себе типы не проверяет, нужен отдельный инструмент.
Что ещё упоминают
🔘
🔘
🔘
Для старта нового проекта
Это готовый рецепт, которого пока что придерживается большинство в сообществе.
А что вы используете? Кто-то уже пробовал
@zen_of_python
uv + ruff + httpx + pytest — этот стек набрал больше всего голосов. Poetry и venv уходят в прошлое, uv забирает всё: и venv, и зависимости, и запуск скриптов.А вот в тайп-чекинге единства нет. Одни ждут pyright, другие пробуют ty или pyrefly. Ruff сам по себе типы не проверяет, нужен отдельный инструмент.
Что ещё упоминают
pydantic — почти как стандарт для валидацииdirenv — автоматическая активация окружения при входе в папкуpandas остаётся дефолтом, но для больших данных смотрят на PySpark/PolarsДля старта нового проекта
uv init myproject
cd myproject
uv add --dev ruff pytest
Это готовый рецепт, которого пока что придерживается большинство в сообществе.
А что вы используете? Кто-то уже пробовал
ty?@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤4🤔1
Бывший CTO поделился тестом, который за 15 секунд отсеивал половину кандидатов. И это не фигура речи, реально 53% ошибались.
Я специально спрячу объяснение за спойлер, чтобы вы могли перейти по ссылке и попробовать решить задачу. Осуждать никого не будем, просто проверьте себя.
Если ваш ответ 1, то поздравляю, вы быстро в уме разобрали код и поняли логику. Если -11, то значит вы скопировали код в ChatGPT или интерпретатор и поленились делать в уме. Так же поступают в среднем 50% кандидатов.
Дело в том, что в коде спрятан знак =, который появляется только при копировании и условие меняется на >= 3. Ну и ответ, конечно, тоже.
И в чём смысл?
Не то чтобы копировать — это прям плохо. Смысл скорее в том, что для простой задачи быстрее прогнать код в голове, чем открывать терминал. Если кандидат не может выполнить три итерации цикла мысленно — это сигнал.
Автор признаёт: метод не идеальный, бывают false negatives. Но он вдвое сокращает время на обработку откликов.
@zen_of_python
Я специально спрячу объяснение за спойлер, чтобы вы могли перейти по ссылке и попробовать решить задачу. Осуждать никого не будем, просто проверьте себя.
Дело в том, что в коде спрятан знак =, который появляется только при копировании и условие меняется на >= 3. Ну и ответ, конечно, тоже.
И в чём смысл?
Не то чтобы копировать — это прям плохо. Смысл скорее в том, что для простой задачи быстрее прогнать код в голове, чем открывать терминал. Если кандидат не может выполнить три итерации цикла мысленно — это сигнал.
Автор признаёт: метод не идеальный, бывают false negatives. Но он вдвое сокращает время на обработку откликов.
@zen_of_python
🔥15❤6
Один разработчик реализовал
Бенчмарки (RTX 3090)
🔘 1 MB: 1,09x (почти одинаково)
🔘 5 MB: 1,80x
🔘 50 MB: 3,43x
🔘 100 MB: 4,37x
Среднее ускорение: 3,45x, пропускная способность: 0,79 GB/s
Ключевые фичи
🔘 Точная семантика Python (leftmost, non-overlapping replacements)
🔘 Streaming mode — файлы больше VRAM обрабатываются чанками
🔘 Session API — несколько замен подряд без переинициализации
🔘 Thread-safe
Пример
➡️ Зачем это нужно
Автор делал GPU-компрессию и хотел убрать лишние трансферы между CPU и GPU. Другие применения: санитизация логов, обработка сетевых пакетов, любые задачи с поиском/заменой в больших бинарных данных.
И давайте признаем, это просто круто, search-replace на CUDA блин :)
📎 Код на GitHub
@zen_of_python
bytes.replace() из Python на CUDA — для обработки многогигабайтных файлов прямо на GPU без передачи данных на CPU.Бенчмарки (RTX 3090)
Среднее ускорение: 3,45x, пропускная способность: 0,79 GB/s
Ключевые фичи
Пример
from cuda_replace import CReplaceLib
lib = CReplaceLib()
result = lib.unified(data, b"pattern", b"replacement")
# Для больших файлов
cleaned = lib.gpu_streaming(huge_data, b"old", b"new", chunk_size=256*1024*1024)
Автор делал GPU-компрессию и хотел убрать лишние трансферы между CPU и GPU. Другие применения: санитизация логов, обработка сетевых пакетов, любые задачи с поиском/заменой в больших бинарных данных.
И давайте признаем, это просто круто, search-replace на CUDA блин :)
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9⚡4
Вышел pandas 3.0: строки теперь хранятся через PyArrow (до 70% экономии памяти, до 13x быстрее), а Copy-on-Write стал обязательным.
Что сломается
🔘 Цепочечное присваивание больше не работает:
🔘 Проверки dtype:
Как мигрировать
1️⃣ Обновитесь до pandas 2.3, уберите warnings
3️⃣ Включите в тестах:
3️⃣ Найдите
4️⃣ Обновляйтесь до 3.0
Требования: Python 3.11+, NumPy 1.26.0+, PyArrow 13.0.0+
Для production лучше подождать пару недель — релиз свежий.
📎 Changelog, GitHub
@zen_of_python
Что сломается
# Было: работало с warning'ом
df["foo"][df["bar"] > 5] = 100
# Стало: молча НЕ работает
# Правильно:
df.loc[df["bar"] > 5, "foo"] = 100
# Было
if df['col'].dtype == object: ...
# Стало
if pd.api.types.is_string_dtype(df['col']): ...
Как мигрировать
pd.options.future.infer_string = Truedtype == object и цепочечные присваиванияТребования: Python 3.11+, NumPy 1.26.0+, PyArrow 13.0.0+
Для production лучше подождать пару недель — релиз свежий.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🫡5🔥1
Репозиторий anthropics/skills — самый популярный Python-репозиторий на GitHub прямо сейчас. +1400 звёзд в день, 50 тыс. уже набежало.
➡️ Что такое Skills
Skills — это папки с инструкциями и скриптами, которые Claude динамически подгружает для выполнения специализированных задач. По сути, плагины для ИИ: вместо того чтобы каждый раз объяснять модели, как работать с вашими процессами, вы описываете это один раз в файле.
Примеры: создание документов с учётом правил компании, анализ данных по специфическим воркфлоу, генерация MCP-серверов, тестирование веб-приложений.
➡️ Как устроено
Skill — это YAML с названием, описанием и markdown-инструкциями. Можно указать примеры использования и ограничения. Claude читает это при активации и следует описанным правилам.
➡️ Зачем это вам
Если используете Claude для повторяющихся задач — Skills позволяют один раз описать процесс и использовать повторно. Документные skills (PDF, DOCX, XLSX) уже готовы. Для собственных — есть шаблон и примеры.
📎 Репозиторий
@zen_of_python
Skills — это папки с инструкциями и скриптами, которые Claude динамически подгружает для выполнения специализированных задач. По сути, плагины для ИИ: вместо того чтобы каждый раз объяснять модели, как работать с вашими процессами, вы описываете это один раз в файле.
Примеры: создание документов с учётом правил компании, анализ данных по специфическим воркфлоу, генерация MCP-серверов, тестирование веб-приложений.
Skill — это YAML с названием, описанием и markdown-инструкциями. Можно указать примеры использования и ограничения. Claude читает это при активации и следует описанным правилам.
---
name: my-skill-name
denoscription: What this skill does
---
# Instructions for Claude...
Если используете Claude для повторяющихся задач — Skills позволяют один раз описать процесс и использовать повторно. Документные skills (PDF, DOCX, XLSX) уже готовы. Для собственных — есть шаблон и примеры.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Вышел packaging 26.0 — тот самый релиз с ускорением в три раза, о котором писал пару недель назад.
Напомню контекст:packaging — библиотека для работы с версиями и зависимостями. Встроена в pip, а pip — в Python. 650+ миллионов скачиваний в месяц.
➡️ Что в релизе
Обещанные оптимизации: регулярки больше не перекомпилируются каждый раз, добавлены
➡️ Новые фичи
PEP 751 — поддержка pylock-файлов для воспроизводимых установок. PEP 794 — импорт метаданных имён пакетов. Positional pattern matching для
➡️ Breaking changes
Обновление подтянется автоматически с новыми версиями pip.
📎 Changelog, PyPI
@zen_of_python
Напомню контекст:
Обещанные оптимизации: регулярки больше не перекомпилируются каждый раз, добавлены
__slots__ для Version и Specifier, улучшено кэширование. Результат — парсинг версий стал в три раза быстрее, количество создаваемых объектов в pip упало с 4,8 млн до 400 тыс.PEP 751 — поддержка pylock-файлов для воспроизводимых установок. PEP 794 — импорт метаданных имён пакетов. Positional pattern matching для
Version и Specifier — теперь работает match version:from packaging.version import Version
match Version("3.14.0"):
case Version(major=3, minor=14):
print("Python 3.14!")
.contains() теперь возвращает False вместо исключения для невалидных версий. Если ловили InvalidVersion — проверьте код.Обновление подтянется автоматически с новыми версиями pip.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5