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 730 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 6 999-o'rinni va Rossiya mintaqasida 35 209-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 18 730 obunachiga ega bo‘ldi.
26 Oktabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -87 ga, so‘nggi 24 soatda esa -8 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 6.18% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 4.24% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 1 158 marta ko‘riladi; birinchi sutkada odatda 795 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 1 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 27 Oktabr, 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.
deque два конца, поэтому легко представить узел на каждый объект. В CPython звено списка хранит блок до 64 элементов. Соседние блоки связаны в обе стороны, а индексы указывают на первый и последний элементы.
При append и pop внутри блока меняются индекс и ячейка. Новый блок нужен, лишь когда крайний заполнен; опустевший крайний блок отсоединяется. Поэтому интерпретатор реже выделяет и освобождает память, чем при отдельном узле на элемент, и deque работает быстрее.
В разборе на mathspp.com эта механика собрана в упрощённой Python-реализации для Python 3.15. По коду можно проследить append и pop; левый край устроен симметрично.int весит 28 байт.
В CPython каждое число является объектом. Кроме значения, у него есть счётчик ссылок и указатель на тип. На 64-битной системе эти служебные поля добавляют минимум 16 байт к каждому объекту. Явное лучше неявного, особенно в профиле памяти.
Массив NumPy с типом uint64 хранит значения вместо ссылок на отдельные объекты Python. Поэтому миллион элементов занимает 8 МБ плюс память на импорт библиотеки. В разборе структуры объектов CPython есть замеры и код. Для больших числовых наборов проверьте NumPy до того, как 8 ГБ превратятся в 35 ГБ.mcp был без ограничения версии, поэтому pip подтянул ветку 2.x, где FastMCP переименовали в MCPServer. Код репозитория не менялся, а прежний импорт перестал работать. Explicit is better than implicit, особенно в файле зависимостей.
Миграция начинается с замены импорта и имени класса. Декораторы @mcp.tool(), @mcp.resource() и тела инструментов в этом проекте остались прежними. Затем стоит закрепить mcp>=2,<3 и отдельно оставить httpx: SDK 2.x больше не устанавливает его как зависимость.
В пошаговом разборе на DEV Community есть проверки синхронных обработчиков, переменных окружения и позиционных аргументов конструктора. Так пакет mcp обновляется внутри репозитория и не откатывается для остальных проектов в системном Python.np.abs(arr).mean() для массива на 1 ГБ выделяет ещё 1 ГБ под абсолютные значения. Цикл Python убирает копию, но возвращает расходы интерпретатора.
В разборе Python⇒Speed решения разделены по задаче. PyPy ускоряет циклы по обычным объектам, но плохо сочетается с NumPy. Numba компилирует функции для NumPy. Cython, Rust, C и C++ позволяют собрать расширение заранее.
«Явное лучше неявного» работает и для оптимизации: выбирайте инструмент по форме узкого места.os.environ. Если добавить её в параметры функции, pytest всё выполнит, но IDE подсветит неиспользуемый аргумент. Автор избегает autouse=True: по его оценке, так о тестах труднее рассуждать.
Декоратор @pytest.mark.usefixtures с именем mock_env назначает фикстуру конкретному тесту. Pytest запускает mock_env, а в сигнатуре остаются только объекты, к которым код обращается напрямую. Декоратор принимает несколько имён фикстур, но помечать им другую фикстуру нельзя.
В короткой статье с примером показано, как убрать серый неиспользуемый параметр и сохранить зависимость на виду. Явность победила, сигнатура тоже.hash() для этого не подходит: хеши строк и bytes меняются между процессами, а списки, словари и изменяемые dataclass он не принимает. hashlib детерминирован, но ждёт байты. Значит, сначала объект надо привести к однозначному набору байтов.
Автор разбирает, почему pickle не обещает одинаковый поток байтов, а str и repr могут терять значимые данные или включать адрес объекта. Решение строится на JSON: встроенные типы, datetime и dataclass приводятся к поддерживаемому представлению, неподдерживаемые значения вызывают ошибку, пустые и выбранные поля можно пропустить.
В статье есть требования, промежуточные неудачные варианты и итоговый код без сторонних зависимостей. Подход пригодится, если хеш хранится дольше одного процесса или должен совпадать в разных реализациях Python.namedtuple всё ещё лучше dataclass
После появления dataclass именованный кортеж перестал быть универсальной заменой маленькому классу. Он всегда поддерживает индексацию и распаковку, поэтому новое поле ломает код с распаковкой, а публичный API рискует навсегда сохранить кортежный протокол.
Это же поведение полезно, когда данные естественно упорядочены: строки БД, результаты разбора бинарного формата, пары заголовков HTTP. Если API уже возвращает обычный кортеж, namedtuple добавит имена полей, не сломав прежних потребителей. Можно и намеренно распаковывать все поля: забытый обработчик упадёт сразу после изменения структуры. Явное лучше неявного, как и договаривались.
В разборе namedtuple и dataclass автор также сравнивает память и скорость. На миллионах экземпляров разница может стать заметной, а в большинстве программ она несущественна.Settings создаётся при импорте пакета, он читает .env и переменные оболочки до запуска фикстуры pytest. Подмена os.environ запаздывает: значения уже сохранены в объекте, а тест зависит от окружения.
Решение автора: фикстура сохраняет model_copy() объекта, сбрасывает поля к значениям по умолчанию из model_fields и применяет точечные переопределения. Неизвестные настройки и неверные типы она отклоняет, после yield восстанавливает исходное состояние.
Подход пригодится, когда Settings уже живёт на уровне модуля. Явное снова лучше неявного. Код фикстуры и тесты со значениями по умолчанию и частичными переопределениями смотрите в разборе подмены Pydantic Settings.from os import listdir имя listdir привязано в модуле product. Последующая подмена os.listdir эту привязку не меняет, поэтому код продолжает вызывать product.listdir.
mock.patch работает как временное присваивание: заменяет имя по указанному пути, а после блока with возвращает исходное значение.
Практическое правило: подменяйте имя там, где его ищет тестируемый код. Здесь нужен mock.patch("product.listdir"). Он изменит поведение только product.py, не затрагивая другие модули. В статье Why your mock doesn’t work механизм разобран на двух способах импорта и схемах связей между именами.ProcessPoolExecutor переопределяет __init__, submit() и shutdown(), а map() и контекстный менеджер получает от родителя. При композиции map() приходится копировать для вызова нового submit(), а контекстный протокол писать заново. «Явное лучше неявного» внезапно означает больше кода.
В разборе решения сравниваются по совместимости с будущими версиями, глобальному состоянию, сложности и отладке. Для полноценной замены считайте не только связи между классами, но и методы, которые придётся делегировать вручную.@pytest.mark.parametrize быстро усложняет чтение: значения приходится сопоставлять с аргументами по позиции, а идентификаторы сценариев хранятся в отдельном списке.
pytest.param помещает id рядом с данными. Тогда отдельный сценарий можно запустить командой pytest -k positive_x_axis. Через marks там же задаются xfail для ожидаемого сбоя и skipif для условного пропуска. Явное лучше неявного, особенно когда тест падает выборочно.
В статье Taming parametrize with pytest.param показан и следующий шаг: собрать именованные аргументы и ожидаемый результат в одном словаре. Такой вариант стоит примерить на тестах с длинной сигнатурой: у каждого сценария данные, имя и условия запуска оказываются рядом.await не дают конкурентности: вторая корутина запустится после первой. Создание двух объектов корутин тоже не планирует их выполнение. Для этого нужны задачи, созданные до первого ожидания.
У каждого способа свои гарантии. gather() возвращает результаты в порядке аргументов. Если одна задача выбрасывает исключение, оно передаётся вызывающему коду сразу, а остальные задачи продолжают работать. as_completed() отдаёт результаты по мере готовности. wait() делит задачи на завершённые и ожидающие, а его тайм-аут сам ничего не отменяет.
В статье Waiting in asyncio автор советует начинать с TaskGroup, а для более гибкого управления выбирать wait(). Здесь «явное лучше неявного» работает буквально.bisect, без куч и деревьев.
Разбор Адриана на death and gravity показывает, как согласовать несколько структур данных и проверить сроки через внедряемые часы. Это пример разработки от простого рабочего варианта к более быстрому только на стандартной библиотеке.AsyncClient.post, настроить асинхронный мок и проверить аргументы. С усложнением запроса растёт и эта обвязка.
Библиотека respx перехватывает запросы HTTPx и возвращает заготовленный ответ. Код короче, зато тест остаётся привязан к HTTPx. Более явный вариант в духе Python: передать клиент в функцию и на тесте заменить его объектом-заглушкой.
Для интеграционной проверки приложение Starlette играет роль тестового сервера, а AsyncClient обращается к нему вместо внешней сети. В статье есть код всех четырёх вариантов. Выбирайте respx для компактной подмены, заглушку вместо сторонней библиотеки для моков, тестовый сервер для проверки связки целиком.