Бэкап, украденный сегодня, расшифруют квантовой машиной через десять лет, и в Python от этого уже есть пакет
Зашифрованный архив можно скачать сейчас и спокойно подождать, пока появится машина, которая его вскроет: файлы на диске живут дольше, чем стойкость нынешних алгоритмов. На этот случай сделана библиотека Quipu: гибридное шифрование, где классическая схема X25519 и постквантовая ML-KEM-1024 работают вместе, так что контейнер откроется, только если падут обе сразу.
Питонисту она приезжает как
Заодно автор объясняет, почему из проекта исчезли слой C ABI и биндинги для Node и Go, которые были в первой версии.
Зашифрованный архив можно скачать сейчас и спокойно подождать, пока появится машина, которая его вскроет: файлы на диске живут дольше, чем стойкость нынешних алгоритмов. На этот случай сделана библиотека Quipu: гибридное шифрование, где классическая схема X25519 и постквантовая ML-KEM-1024 работают вместе, так что контейнер откроется, только если падут обе сразу.
Питонисту она приезжает как
pip install quipu-crypto, нативным колесом на PyO3; внутри Rust без сборщика мусора и без собственного unsafe. API короткий: encrypt_stream с decrypt_stream шифруют по паролю, generate_keypair с encode_to_recipient закрывают данные под конкретного получателя.Заодно автор объясняет, почему из проекта исчезли слой C ABI и биндинги для Node и Go, которые были в первой версии.
😁3
deepcopy копирует всё, до чего дотянется, включая то, что вы копировать не собирались
Знакомая поломка: конфиг сложили в словарь, сделали
Поведение настраивается методами
Разбор поверхностной и глубокой копии — в статье на dev.to.
#python
Знакомая поломка: конфиг сложили в словарь, сделали
copy.copy, поправили вложенный список в клоне и увидели правку в оригинале. Новый контейнер получает те же ссылки на вложенные объекты.copy.deepcopy идёт по графу рекурсивно и ведёт словарь memo: каждый скопированный объект запоминается по id. Циклическая ссылка поэтому не уводит копирование в бесконечность, а два поля, смотревшие на один список, в копии тоже смотрят на один. Плата — обход всего графа: объект, который держит открытый сокет или пул соединений, deepcopy либо уронит, либо утащит за собой пол-приложения.Поведение настраивается методами
__copy__ и __deepcopy__: класс сам решает, что воспроизвести заново, а что отдать по ссылке.Разбор поверхностной и глубокой копии — в статье на dev.to.
#python
❤1
Язык, на котором вы пишете каждый день, десятый год подряд оплачивает в том числе Meta*
Python Software Foundation живёт на пожертвованиях, и Meta* десятый год подряд числится среди спонсоров. Python у них самый используемый язык, на нём держится бэкенд Instagram* и Threads*.
Деньгами участие не ограничивается. Часть core-разработчиков CPython работает в Meta*: они пишут фичи и PEP'ы, так что каким язык станет в следующем релизе, решают в том числе люди на зарплате компании. Оттуда же вышел PyTorch, позже переехавший в собственный фонд, и Pyrefly, тайпчекер с language server, который в компании называют очень быстрым.
Последнее проверяется дешевле, чем обсуждается: если mypy на вашем проекте прогоняется минутами, поставьте Pyrefly рядом и сравните время на том же коде.
#cpython
*Компания Meta и её продукты признаны экстремистскими, их деятельность запрещена на территории РФ.
Python Software Foundation живёт на пожертвованиях, и Meta* десятый год подряд числится среди спонсоров. Python у них самый используемый язык, на нём держится бэкенд Instagram* и Threads*.
Деньгами участие не ограничивается. Часть core-разработчиков CPython работает в Meta*: они пишут фичи и PEP'ы, так что каким язык станет в следующем релизе, решают в том числе люди на зарплате компании. Оттуда же вышел PyTorch, позже переехавший в собственный фонд, и Pyrefly, тайпчекер с language server, который в компании называют очень быстрым.
Последнее проверяется дешевле, чем обсуждается: если mypy на вашем проекте прогоняется минутами, поставьте Pyrefly рядом и сравните время на том же коде.
#cpython
*Компания Meta и её продукты признаны экстремистскими, их деятельность запрещена на территории РФ.
❤4❤🔥1
Forwarded from Точка входа в программирование
Сообщение об ошибке в Python подсказывает, где сломался код, если читать его с конца
Программа упала, в терминале простыня красного текста, которую хочется закрыть не читая. А имя ошибки и пояснение стоят в последней строке. NameError: переменной с таким именем нигде не создано, обычно опечатка. IndexError: вы просите шестой элемент у списка из пяти. Строки выше показывают файл и номер строки, где всё оборвалось.
Когда имя понятно, а причина нет, ставьте print перед подозрительным местом и сверяйте значения переменных с тем, что ожидали. Если print становится слишком много, включайте встроенный отладчик pdb: он останавливает программу в нужной точке и показывает значения прямо там. Хендбук freeCodeCamp по отладке разбирает имена ошибок подробнее и учит работать с pdb.
Возьмите ошибку, на которой застряли недавно, и разложите её по схеме: имя, пояснение, номер строки.
#python #основы
Программа упала, в терминале простыня красного текста, которую хочется закрыть не читая. А имя ошибки и пояснение стоят в последней строке. NameError: переменной с таким именем нигде не создано, обычно опечатка. IndexError: вы просите шестой элемент у списка из пяти. Строки выше показывают файл и номер строки, где всё оборвалось.
Когда имя понятно, а причина нет, ставьте print перед подозрительным местом и сверяйте значения переменных с тем, что ожидали. Если print становится слишком много, включайте встроенный отладчик pdb: он останавливает программу в нужной точке и показывает значения прямо там. Хендбук freeCodeCamp по отладке разбирает имена ошибок подробнее и учит работать с pdb.
Возьмите ошибку, на которой застряли недавно, и разложите её по схеме: имя, пояснение, номер строки.
#python #основы
🥱5
Код без GIL запускается одной командой, а зависимости к этому готовы не все
Проверка занимает вечер: ставите сборку python3.14t, прогоняете тесты и смотрите, где C-расширение роняет интерпретатор, а где два потока портят общий словарь. Со стороны CPython работа сделана: в 3.13 сборку без глобальной блокировки отдавали как экспериментальную, в 3.14 она стала официально поддерживаемой. Узкое место переехало в экосистему: пакет с C-кодом заводится в такой сборке, только если его пересобрали и проверили под неё.
На PyCon US 2026 Томас Ваутерс, который занимается CPython 25 лет и входит в steering council, прошёл по всей истории: зачем блокировку вообще снимали, что из этого получилось к сегодняшнему дню и станет ли сборка без GIL единственной. Конспект доклада опубликовал LWN.
#cpython
Проверка занимает вечер: ставите сборку python3.14t, прогоняете тесты и смотрите, где C-расширение роняет интерпретатор, а где два потока портят общий словарь. Со стороны CPython работа сделана: в 3.13 сборку без глобальной блокировки отдавали как экспериментальную, в 3.14 она стала официально поддерживаемой. Узкое место переехало в экосистему: пакет с C-кодом заводится в такой сборке, только если его пересобрали и проверили под неё.
На PyCon US 2026 Томас Ваутерс, который занимается CPython 25 лет и входит в steering council, прошёл по всей истории: зачем блокировку вообще снимали, что из этого получилось к сегодняшнему дню и станет ли сборка без GIL единственной. Конспект доклада опубликовал LWN.
#cpython
LWN.net
Free-threaded Python: past, present, and future
Probably the biggest change for Python over the last five years or so is the advent of the 'fre [...]
Научные библиотеки сошлись на 3.14t как общей цели free-threading
Если вы держите отдельное окружение под сборку без GIL, зоопарк собранных колёс наконец сокращается: поддержку 3.13t крупные научные библиотеки убрали и целятся теперь только в 3.14t. Проверять свой код на свободных потоках можно на одной версии, а не на двух.
Что ещё случилось за август, Real Python собрал в месячном дайджесте:
• Python 3.15 выпустил финальную бету;
• команда JIT ответила Steering Council на его ультиматум;
• Astral выкатила ломающие миноры uv и Ruff: перед обновлением стоит заглянуть в changelog;
• MCP пережил крупнейшую переписку с момента появления: сессии выброшены, протокол стал stateless, а FastMCP в Python SDK переименовали.
#cpython
Если вы держите отдельное окружение под сборку без GIL, зоопарк собранных колёс наконец сокращается: поддержку 3.13t крупные научные библиотеки убрали и целятся теперь только в 3.14t. Проверять свой код на свободных потоках можно на одной версии, а не на двух.
Что ещё случилось за август, Real Python собрал в месячном дайджесте:
• Python 3.15 выпустил финальную бету;
• команда JIT ответила Steering Council на его ультиматум;
• Astral выкатила ломающие миноры uv и Ruff: перед обновлением стоит заглянуть в changelog;
• MCP пережил крупнейшую переписку с момента появления: сессии выброшены, протокол стал stateless, а FastMCP в Python SDK переименовали.
#cpython
Forwarded from Представляешь,
Trame v4 добавил управление React-компонентами из Python
При создании приложения на Python-фреймворке trame теперь можно выбрать client_type="react" и сохранить привычные механизмы состояния, событий и триггеров. Связки react.Bind и react.Callback синхронизируют серверную логику с интерфейсом — без отдельного REST API и самописного обмена данными.
Обновление прежде всего пригодится организациям с готовыми React-библиотеками и дизайн-системами: их можно задействовать без полной переделки фронтенда. Но смены фаворита пока нет — Vue.js остаётся стандартным и наиболее полным клиентом, а Kitware не обещает паритета возможностей.
В статье перечислены поддерживаемые на старте компоненты и варианты рендеринга.
При создании приложения на Python-фреймворке trame теперь можно выбрать client_type="react" и сохранить привычные механизмы состояния, событий и триггеров. Связки react.Bind и react.Callback синхронизируют серверную логику с интерфейсом — без отдельного REST API и самописного обмена данными.
Обновление прежде всего пригодится организациям с готовыми React-библиотеками и дизайн-системами: их можно задействовать без полной переделки фронтенда. Но смены фаворита пока нет — Vue.js остаётся стандартным и наиболее полным клиентом, а Kitware не обещает паритета возможностей.
В статье перечислены поддерживаемые на старте компоненты и варианты рендеринга.
Дескриптор может удерживать ваши объекты, но слабые ссылки это исправят
Вы удалили экземпляр, а память не освободилась. Причина может прятаться в дескрипторе: если он записывает проверенные экземпляры в обычный
Если хранить сами экземпляры всё-таки нужно, замените словарь на слабый:
Слабый ключ не мешает сборщику удалить объект, когда на него больше нет сильных ссылок. Питонично: сообщаем, кого видели, но не берём опеку над его временем жизни.
В разборе Memory leakage in Python descriptors есть полный пример утечки и её исправления. Проверьте дескрипторы, которые копят экземпляры после валидации.
Вы удалили экземпляр, а память не освободилась. Причина может прятаться в дескрипторе: если он записывает проверенные экземпляры в обычный
dict, словарь сохраняет сильные ссылки. Сборщик мусора не удалит такие объекты, и утечка будет расти понемногу.Если хранить сами экземпляры всё-таки нужно, замените словарь на слабый:
import weakref
_seen = weakref.WeakKeyDictionary()
Слабый ключ не мешает сборщику удалить объект, когда на него больше нет сильных ссылок. Питонично: сообщаем, кого видели, но не берём опеку над его временем жизни.
В разборе Memory leakage in Python descriptors есть полный пример утечки и её исправления. Проверьте дескрипторы, которые копят экземпляры после валидации.
🔥1
Сотни тысяч корутин лучше не запускать разом
Если запустить всю пачку асинхронных операций сразу, вы нагрузите вызываемые сервисы, а всё необходимое для работы окажется в памяти одновременно. Ограничение конкурентности нужно до того, как очередь съест ресурсы.
Питоничная цель напоминает
В разборе ограничения конкурентности сопоставлены
Если запустить всю пачку асинхронных операций сразу, вы нагрузите вызываемые сервисы, а всё необходимое для работы окажется в памяти одновременно. Ограничение конкурентности нужно до того, как очередь съест ресурсы.
Питоничная цель напоминает
imap_unordered(): одновременно выполнять не больше limit операций и отдавать результаты по мере готовности. asyncio.Semaphore кажется очевидным ответом из Stack Overflow, но автор предупреждает: лучший вариант другой.В разборе ограничения конкурентности сопоставлены
gather(), Semaphore, as_completed(), Queue и wait(). Читайте, чтобы понять, почему автор выбрал wait() и как собрал асинхронный map_unordered() с поддержкой итерируемых объектов и исключений.death and gravity
Limiting concurrency in Python asyncio: the story of async imap_unordered()
So, you're doing some async stuff, repeatedly, hundreds of thousands of times. How do you *not* do it all at once? Hint: asyncio.Semaphore is not always the best way, despite what Stack Overflow may tell you ;)
Внешние ключи Django могут оставить лишние индексы и заблокировать миграцию
В модели всё выглядит аккуратно: несколько
Статья How to Get Foreign Keys Horribly Wrong разбирает, где появляются дублирующие индексы и как обнаружить блокирующую миграцию. Затем переходит к безопасному переносу внешнего ключа, обратимым операциям и конкурентному созданию индексов.
Перед следующим изменением схемы по ссылке стоит проверить ещё две вещи: когда нужен частичный индекс и в каком порядке выполнять миграционные операции.
В модели всё выглядит аккуратно: несколько
ForeignKey, on_delete=PROTECT и unique_together. Но внешний ключ связывает две таблицы, поэтому обеспечить такое ограничение сложнее, чем уникальность или проверку значения. Явное лучше неявного, а неявного поведения здесь хватает.Статья How to Get Foreign Keys Horribly Wrong разбирает, где появляются дублирующие индексы и как обнаружить блокирующую миграцию. Затем переходит к безопасному переносу внешнего ключа, обратимым операциям и конкурентному созданию индексов.
Перед следующим изменением схемы по ссылке стоит проверить ещё две вещи: когда нужен частичный индекс и в каком порядке выполнять миграционные операции.
Hakibenita
How to Get Foreign Keys Horribly Wrong
Common Pitfalls and Potential Optimizations in Django
❤1
Как найти хеш пароля в 37 ГБ меньше чем за миллисекунду
Офлайн-проверка пароля по списку утечек выглядит как обычный поиск, пока Pwned Passwords не распаковывается в текстовый файл на 37 ГБ. Минимальный вариант на Python работает, но оказывается слишком медленным.
Автор профилирует код, пробует пропускать части файла, применяет двоичный поиск, строит отдельный индекс и переводит его в двоичный формат. Вполне по дзену: сначала измерить, потом усложнять. Результат: поиск занимает меньше миллисекунды.
В разборе оптимизации можно проследить, почему первые ускорения не уложились в цель, как генерируется и читается индекс и какие структуры данных автор рассматривает в финале.
Офлайн-проверка пароля по списку утечек выглядит как обычный поиск, пока Pwned Passwords не распаковывается в текстовый файл на 37 ГБ. Минимальный вариант на Python работает, но оказывается слишком медленным.
Автор профилирует код, пробует пропускать части файла, применяет двоичный поиск, строит отдельный индекс и переводит его в двоичный формат. Вполне по дзену: сначала измерить, потом усложнять. Результат: поиск занимает меньше миллисекунды.
В разборе оптимизации можно проследить, почему первые ускорения не уложились в цель, как генерируется и читается индекс и какие структуры данных автор рассматривает в финале.
death and gravity
Has your password been pwned? Or, how I almost failed to search a 37 GB text file in under 1 millisecond (in Python)
... in which we check if your password has been compromised in many inconvenient ways, in a tale of destruction, obsession, and self-discovery.
Как выбрать быстрый способ читать Excel из Python без сюрпризов с типами
Когда в Python нужно разобрать большой XLSX, привычный Pandas оказывается лишь одной из шести опций. Сравнивать их только по секундомеру мало: ещё важны сохранность типов и корректность значений.
Питоничность здесь начинается с контракта: каждая реализация возвращает
В сравнении Haki Benita остались итоговые замеры для Pandas, Tablib, Openpyxl, LibreOffice, DuckDB и Calamine, а также разбор типов и корректности. Полезный ориентир перед тем, как ставить очередную зависимость ради одной таблицы.
Когда в Python нужно разобрать большой XLSX, привычный Pandas оказывается лишь одной из шести опций. Сравнивать их только по секундомеру мало: ещё важны сохранность типов и корректность значений.
Питоничность здесь начинается с контракта: каждая реализация возвращает
Iterator[dict[str, object]], поэтому потребитель может обрабатывать строки по одной. Для теста взяли файл на 25 МБ с 500 тысячами строк, а время измеряли полным проходом без обработки данных.В сравнении Haki Benita остались итоговые замеры для Pandas, Tablib, Openpyxl, LibreOffice, DuckDB и Calamine, а также разбор типов и корректности. Полезный ориентир перед тем, как ставить очередную зависимость ради одной таблицы.
Контекст запроса можно добавить во все логи без ручного extra
В ASGI-приложении запрос заканчивается не там, где начался: обработчик вызывает корутины из других слоёв, и каждая пишет собственные сообщения. Если добавить
Явное лучше неявного, но собирать один и тот же контекст в каждом слое и вручную передавать его дальше — дорогая трактовка PEP 20.
В разборе распространения контекста логов показано, как общие поля попадают в сообщения из разных слоёв ASGI-приложения без ручной передачи по всей цепочке вызовов.
В ASGI-приложении запрос заканчивается не там, где начался: обработчик вызывает корутины из других слоёв, и каждая пишет собственные сообщения. Если добавить
user_id и platform через extra только в обработчике, запись из вложенной функции останется без этих полей.Явное лучше неявного, но собирать один и тот же контекст в каждом слое и вручную передавать его дальше — дорогая трактовка PEP 20.
В разборе распространения контекста логов показано, как общие поля попадают в сообщения из разных слоёв ASGI-приложения без ручной передачи по всей цепочке вызовов.