Zen of Python
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL
Ko'proq ko'rsatish📈 Telegram kanali Zen of Python analitikasi
Zen of Python (@zen_of_python) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 18 877 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 6 775-o'rinni va Rossiya mintaqasida 34 766-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 18 877 obunachiga ega bo‘ldi.
14 Sentabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -147 ga, so‘nggi 24 soatda esa 1 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 8.58% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 5.58% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 1 620 marta ko‘riladi; birinchi sutkada odatda 1 054 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 4 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent github, rust, pip, api, install kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Полный Дзен Пайтона в одном канале
Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site
Регистрация в перечне РКН: https://tprg.ru/xZOL”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 15 Sentabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
await не дают конкурентности: вторая корутина запустится после первой. Создание двух объектов корутин тоже не планирует их выполнение. Для этого нужны задачи, созданные до первого ожидания.
У каждого способа свои гарантии. gather() возвращает результаты в порядке аргументов. Если одна задача выбрасывает исключение, оно передаётся вызывающему коду сразу, а остальные задачи продолжают работать. as_completed() отдаёт результаты по мере готовности. wait() делит задачи на завершённые и ожидающие, а его тайм-аут сам ничего не отменяет.
В статье Waiting in asyncio автор советует начинать с TaskGroup, а для более гибкого управления выбирать wait(). Здесь «явное лучше неявного» работает буквально.bisect, без куч и деревьев.
Разбор Адриана на death and gravity показывает, как согласовать несколько структур данных и проверить сроки через внедряемые часы. Это пример разработки от простого рабочего варианта к более быстрому только на стандартной библиотеке.AsyncClient.post, настроить асинхронный мок и проверить аргументы. С усложнением запроса растёт и эта обвязка.
Библиотека respx перехватывает запросы HTTPx и возвращает заготовленный ответ. Код короче, зато тест остаётся привязан к HTTPx. Более явный вариант в духе Python: передать клиент в функцию и на тесте заменить его объектом-заглушкой.
Для интеграционной проверки приложение Starlette играет роль тестового сервера, а AsyncClient обращается к нему вместо внешней сети. В статье есть код всех четырёх вариантов. Выбирайте respx для компактной подмены, заглушку вместо сторонней библиотеки для моков, тестовый сервер для проверки связки целиком.asyncio.run(), Python каждый раз создаёт и закрывает цикл событий. Для одиночного запуска это нормально, но между вызовами не сохранятся привязанные к циклу ресурсы, например aiohttp.ClientSession с пулом соединений.
С Python 3.11 asyncio.Runner позволяет выполнять несколько корутин в одном цикле. Однако пока цикл занят, синхронная часть приложения ждёт. Следующий шаг: перенести цикл в отдельный поток и передавать ему корутины из обычных функций.
В подробном разборе автор собирает ThreadRunner, который запускает корутины и превращает асинхронные итераторы в обычные. Получается точечный мост для существующего синхронного приложения без переписывания всей цепочки в async def.ThreadPoolExecutor, настраиваете пул соединений, а пропускная способность перестаёт расти. Даже короткий вычислительный участок повторяется в каждом задании и постепенно отбирает выигрыш от новых потоков.
Перейти на ProcessPoolExecutor можно, но тогда вход приходится разбивать на пачки, менять код и платить памятью за процессы. Автор собирает гибрид: несколько процессов, внутри каждого пул потоков, с привычным интерфейсом исполнителя задач.
В разборе ProcessThreadPoolExecutor остались возврат результатов через собственные объекты Future, гибель рабочего процесса и влияние свободнопоточного Python на всю конструкцию.isinstance() всё просто: mypy сам сужает объединение типов в каждой ветке. Сложнее, если объект приходится распознавать по содержимому, например проверять поля словаря. Тогда проверку выносят в отдельный предикат, а TypeGuard сообщает анализатору, какой тип прошёл условие.
На этом месте интуиция может подвести: автор несколько раз отказывался от TypeGuard и заканчивал комментарием # type: ignore. В разборе TypeGuard и TypeIs он начинает с TypedDict для Person и объясняет, почему TypeIs соответствует ожиданиям лучше.
Стоит прочитать перед следующим пользовательским предикатом: в статье осталось главное, почему TypeIs оказался тем интерфейсом, которого автор ожидал от TypeGuard.__getattr__: он обрабатывает обращение к имени, которого в модуле нет.
Для нужного имени функция возвращает динамически созданное значение, для остальных поднимает AttributeError. Так создание атрибута переносится на момент, когда он действительно понадобился, а запуск не ждёт этой работы. Лень здесь вполне питонична, пока ошибка для неизвестных имён остаётся явной.
В разборе атрибутов модуля есть минимальный пример с обычной функцией, динамическим атрибутом и AttributeError для неизвестного имени.user_id и platform через extra только в обработчике, запись из вложенной функции останется без этих полей.
Явное лучше неявного, но собирать один и тот же контекст в каждом слое и вручную передавать его дальше — дорогая трактовка PEP 20.
В разборе распространения контекста логов показано, как общие поля попадают в сообщения из разных слоёв ASGI-приложения без ручной передачи по всей цепочке вызовов.Iterator[dict[str, object]], поэтому потребитель может обрабатывать строки по одной. Для теста взяли файл на 25 МБ с 500 тысячами строк, а время измеряли полным проходом без обработки данных.
В сравнении Haki Benita остались итоговые замеры для Pandas, Tablib, Openpyxl, LibreOffice, DuckDB и Calamine, а также разбор типов и корректности. Полезный ориентир перед тем, как ставить очередную зависимость ради одной таблицы.ForeignKey, on_delete=PROTECT и unique_together. Но внешний ключ связывает две таблицы, поэтому обеспечить такое ограничение сложнее, чем уникальность или проверку значения. Явное лучше неявного, а неявного поведения здесь хватает.
Статья How to Get Foreign Keys Horribly Wrong разбирает, где появляются дублирующие индексы и как обнаружить блокирующую миграцию. Затем переходит к безопасному переносу внешнего ключа, обратимым операциям и конкурентному созданию индексов.
Перед следующим изменением схемы по ссылке стоит проверить ещё две вещи: когда нужен частичный индекс и в каком порядке выполнять миграционные операции.imap_unordered(): одновременно выполнять не больше limit операций и отдавать результаты по мере готовности. asyncio.Semaphore кажется очевидным ответом из Stack Overflow, но автор предупреждает: лучший вариант другой.
В разборе ограничения конкурентности сопоставлены gather(), Semaphore, as_completed(), Queue и wait(). Читайте, чтобы понять, почему автор выбрал wait() и как собрал асинхронный map_unordered() с поддержкой итерируемых объектов и исключений.dict, словарь сохраняет сильные ссылки. Сборщик мусора не удалит такие объекты, и утечка будет расти понемногу.
Если хранить сами экземпляры всё-таки нужно, замените словарь на слабый:
import weakref _seen = weakref.WeakKeyDictionary()Слабый ключ не мешает сборщику удалить объект, когда на него больше нет сильных ссылок. Питонично: сообщаем, кого видели, но не берём опеку над его временем жизни. В разборе Memory leakage in Python descriptors есть полный пример утечки и её исправления. Проверьте дескрипторы, которые копят экземпляры после валидации.
