Zen of Python – Telegram
Zen of Python
20K subscribers
1.31K photos
191 videos
38 files
3.36K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
​​Не триггеримся: как унять головную боль

Когда питаться обезболом не хочется, а парить стопы не к месту. Когда-то точно понадобится, сохраняйте:

Выйди на воздух, разомни шею и плечи. Часто этого хватает.
Промни затылок пальцами — напряжение уходит вместе с болью.
Если пульсирует — закрой шторы, посиди в тишине, без раздражителей.
Холод к лбу, тепло к шее — старый, но рабочий трюк.
Выпей воды, перекуси, сядь ровно. Базовые вещи спасают чаще, чем кажется.
Убери экран, дай глазам отдохнуть.
– Если не отпускает — проверь давление или другие очевидные причины.
61
Что вы чувствуете, когда осознаете, что текст написан GPT?
Anonymous Poll
49%
Отношусь нейтрально
35%
Терпеть не могу нагенеренное
8%
Не вижу разницы
8%
Другое
👏1🌚1
Зачем нужны «ленивые» (lazy) импорты

Когда модуль импортируется, интерпретатор выполняет весь код на глобальном уровне этого модуля, включая все его собственные импорты и инициализации. В больших приложениях и тестовых наборах это может заметно замедлять запуск и фазу сбора тестов. Поэтому идея «ленивого импорта» — откладывать импорт «тяжёлых» зависимостей до момента, когда они действительно понадобятся — помогает улучшить отзывчивость приложения и сократить время тестирования.


Переносим import внутрь функции

Самый очевидный и безопасный способ сделать импорт ленивым — переместить import из глобальной области видимости внутрь функции или метода, где ресурс реально используется. При таком подходе импорт произойдёт только при первом вызове этой функции (и далее кешируется в sys.modules, поэтому реальной «повторной» загрузки не происходит). Это даёт быстрый выигрыш для модулей, которые редко используются или инициализируют тяжёлые зависимости:


def do_heavy_task():
import heavy_lib
heavy_lib.run()


Плюсы: простота. Минусы: если импорт нужен во многих местах, придётся либо дублировать import (что допустимо), либо устанавливать глобальную переменную после первого импорта.


Вариант с importlib — когда нужно контролировать пространство имён

Если хочется более явного контроля (например, избежать появления имени в локальной области каждой функции), можно использовать importlib.import_module() и присваивать результат в переменную (глобальную или локальную). Это зачастую полезно при динамическом импорте по имени строки:

Пример:


from importlib import import_module

def use_feature():
mod = import_module("heavy_lib")
mod.do()



Как найти «тяжёлые» импорты — инструмент `python -X importtime

Прежде чем делать импорты ленивыми, полезно понять, что именно тормозит загрузку. Для этого есть встроенная опция: python -X importtime your_program.py — она выводит дерево импорта с временами, позволяя увидеть самые затратные узлы. Это особенно полезно при оптимизации большого проекта или ускорении фазы сбора тестов.


Особая зона внимания — pytest и фаза collection

Pytest во время collection импортирует все тестовые файлы — следовательно, импорты в глобальной области тестов будут исполнены на этапе collection, даже если сам тест не будет запущен. Это распространённый источник задержек в больших тестовых наборах. Решение — переносить импорты внутрь тестовых функций, использовать importlib внутри тестов.


«Глобальный» трюк

Если модуль содержит множество функций, которые все используют одну и ту же тяжёлую библиотеку, имеет смысл импортировать её при первом нужном вызове и сохранить в глобальной переменной модуля (через `global`).
Короткая иллюстрация:


# module.py
heavy = None

def first_use():
global heavy
if heavy is None:
import heavy_lib
heavy = heavy_lib
heavy.do()



Когда ленивые импорты — плохая идея

🔘 Если импорт жизненно важен для модуля и должен бросать ошибки во время старта (fail fast), откладывание импорта может скрыть проблему до момента выполнения, что усложнит отладку.
🔘 Когда импорт идёт с побочными эффектами, которые вы ожидаете увидеть при импортировании модуля — откладывая импорт, вы меняете поведение.

#основы
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
​​blind_watermark | Невидимые, но все же водяные знаки

Новый уровень вотермарков — «слепые» (blind). Обычный человек не увидит разницы между изображениями до и после, но специальный алгоритм сможет, даже при издевательствах над изображением вроде обрезки или поворота. Библиотека позволяет быстро навесить такую защиту на ваш контент и распознать ее.
3
​​mathwords.com | Глоссарий математики, статистики и прочих подобных наук

Если уж вам приходится освежать термины в рамках собесов, MathWords — словарь терминов и определений умеренного размера. Квантили и моды, абсциссы и экспонента, корень и остаток — база не только для старшеклассника, но и для Python-разработчика.

#инструмент
@zen_of_python
👍5
Вопросы подписчиков

Zen of Python поддерживает новоприбывших (и не только) в особой рубрике. Как это работает:

— Спрашивайте что угодно (в комментариях под этим постом), связанное с Python. Здесь нет плохих вопросов!
— Сообщество вас поддержит. Самые интересные вопросы мы разберём в отдельном посте.

#обсуждение
@zen_of_python
1
👎14🤷‍♂1🤔1
Придумайте смешную подпись к фото так, чтобы это относилось к ЯП
#обсуждение
@zen_of_python
Шпаргалка Linux.pdf
311.3 KB
Шпаргалка Linux

Если вам предстоит демонстрировать навыки обращения с этой ОС на собесе или вы просто хотите узнать свои пробелы, обратите внимание на эту шпаргалку. Помимо классики вроде перемещения / переименования файлов, она содержит еще разделы про сеть (Networking), управление сервисами (systemd), контейнеризацию, которые часто не входят в базовые программы онлайн-университетов.

#обучение
@zen_of_python
This media is not supported in your browser
VIEW IN TELEGRAM
Roo-Code | Опенсорсный ИИ-копайлот в VS Code

Еще одно расширение IDE, в которое можно внедрить любую GPT, платную или бесплатную. На видео демонстрируется фича Auto Approve, с помощью который вы задаете, какие фичи сразу принимаются, а какие потребуют вашей проверки.

Доступен в РФ: да
Цена: бесплатно
@prog_tools
Forwarded from Типичный программист
Дайте два 😮‍💨

Напомним, как всё было: летом вы голосовали за концепт и дизайн упаковки нашего фирменного напитка — между ТИПИЧНЫМ и ТОКСИЧНЫМ. Предсказуемо победил ТОКСИЧНЫЙ ПРОГРАММИСТ.

Лимитка получилась настолько удачной, что понадобился ещё один релиз. Paradox уже выкатили коллаб в продажу, а мы запускаем новый розыгрыш — 3 победителя получат коробку «ТОКСИЧНЫЙ ПРОГРАММИСТ» с шестью банками.

Подробнее с правилами можно ознакомиться здесь.

Чтобы участвовать, нужно:
— быть подписанным на @tproger и @paradox_beer;
— оставить реакцию под этим постом;
— нажать кнопку «Участвую».

Итоги подведём 27 октября. Победителей выберем с помощью бота.

А если ты не хочешь ждать, то можешь уже купить свой ТОКСИЧНЫЙ IPA. Всем удачи!

Участников: 709
Призовых мест: 3
Дата розыгрыша: 18:00, 27.10.2025 MSK (1 час)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
super(): как это работает

Сегодня мы разберём одно из ключевых понятий объектно-ориентированного программирования в Python — super(). Когда мы работаем с наследованием, то порой сталкиваемся с дублированием кода:


class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary

def raise_salary(self, amount):
self.salary += amount


class Manager(Employee):
def __init__(self, name, salary, department):
self.name = name
self.salary = salary
self.department = department


На первый взгляд, всё верно. Но посмотрите внимательно — часть кода в Manager.__init__ дублирует логику базового класса Employee. В больших проектах уследить за всеми такими повторениями становится трудоемко. Решение простое — использовать super():


class Manager(Employee):
def __init__(self, name, salary, department):
super().__init__(name, salary)
self.department = department


Теперь Manager вызывает конструктор базового класса Employee, а значит:

🔘 Код становится короче;
🔘 Меньше ошибок при рефакторинге.


Как это работает под капотом

Многие думают, что super() — это функция. На самом деле это класс. При его вызове возвращается прокси-объект, который даёт доступ к методам родительского класса. То есть строка:


super().__init__(name, salary)


означает:

«Возьми ближайший родительский класс в иерархии и вызови его метод `__init__()`».


Что важно помнить

🔘 super() работает не только в __init__. Его можно использовать в любых методах, которые переопределяются в подклассе;
🔘 Можно вызывать super() без аргументов — контекст определяется автоматически;
🔘 В сложных системах с множественным наследованием super() работает через механизм Method Resolution Order (MRO). Это гарантирует, что каждый базовый класс вызывается ровно один раз.

#основы
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍131
​​Импортозамещение Trello, Jira и Confluence — подборка для разработчиков

На Tproger представили подборку российских альтернатив Trello, Jira и Confluence с акцентом на коллективное хранения документов. В статье вы найдете инструменты, которые позволяют управлять процессами, задачами и документацией в одном пространстве, без разделения между трекером и хранилищем знаний. Инструменты соответствуют ФЗ-152 (о персональных данных) — все решения размещаются на отечественных серверах или поддерживают on-premise. Среди разбираемых продуктов есть как простые таск-системы, так и комплексные платформы с удобным редактором, версионированием и автоматической миграцией контента из зарубежных сервисов.

@prog_tools
1🤣1💊1
​​Python Software Foundation отвергла грант США на $1,5 млн из-за запрета на инициативы по инклюзивности

PSF неожиданно отказалась от гранта на 1,5 млн долларов, предложенного Национальным научным фондом США (NSF), из-за условий, запрещающих организациям-получателям продвигать программы, направленные на разнообразие, равенство и инклюзивность. Несмотря на финансовую поддержку в рамках проекта по безопасности opensource-экосистем, PSF сочла, что такие ограничения противоречат её ценностям и миссии. Совет директоров единодушно отверг предложение, указав, что запрет на инициативы DEI (diversity, equity, inclusion) может повредить всей её деятельности. Решение принято в условиях сохраняющейся потребности фонда в ресурсах и растущего внимания к безопасности экосистемы Python.

#факт
@zen_of_python
🌚106😁5👎2
air | Веб-фреймворк на базе FastAPI, Starlette и Pydantic

Новый минималистичный веб-тул от авторов книги 'Two Scoops of Django'. Крутая особенность — Air Tags, теги-компоненты по аналогии с React. С Air проще писатьвеб-приложения с подкапотным API. Хорошая попытка исправить то, что не нравится в Django.

#инструмент
@zen_of_python
🤔2
​​Юн Цуй «Рецепты Python. Коллекция лучших техник программирования»

Если вам уже попадалась постепенно усложняющаяся книга по языку, которую труднее читать к концу, то в этот раз будет по-другому. В книге Юн Цуй собрал 63 самых полезных, по его мнению, навыков Python-разработчика, К примеру, в одной из глав задача ««Как найти элементы в последовательности?» получает сначала базовое решение, а потом дополняется еще двумя.

#обучение
@zen_of_python
🔥21
​​Python for Everyone | Короткие видеотуториалы

Англоязычный YouTube-канал, прекрасно «грокающий» различные концепции языка, будь то декораторы, миксины или полиморфизм. Каждый ролик — кустарный мультфильм с демонстрацией предельно понятного кода.

#обучение
@zen_of_python
1
Вопросы подписчиков

Zen of Python поддерживает новоприбывших (и не только) в особой рубрике. Как это работает:

— Спрашивайте что угодно (в комментариях под этим постом), связанное с Python. Здесь нет плохих вопросов!
— Сообщество вас поддержит. Самые интересные вопросы мы разберём в отдельном посте.

#обсуждение
@zen_of_python
Пользователь Reddit поделился Python-библиотекой для быстрых запросов к файловой системе и выполнения действий над найденными файлами.

Основная идея: вместо кучи строк кода, os.stat и datetime писать так:
query = Query(
where_expr=(AgeDays() > 7) & (Size() > "10 mb") & Suffix(".log"),
from_paths="C:/logs",
threaded=True
)
result_set = query.select()

Т.е. найти логи старше 7 дней и больше 10 МБ.

Выглядит удобно, но как-то не очень pythonic, вам не кажется? Как будто если делаешь что-то SQL-like, то лучше напрямую SQL и взять, а не изобретать мини-язык внутри Python. И это как раз самое интересное — в комментах начали предлагать как можно сделать лучше.

Например, вот так:
query(lambda p: p.age_days < 7 and p.size > 10_000_000 and p.suffix == ".log")

Добавить обёртку, которая будет вычислять необходимые свойства по запросу с использованием cached_property и получим по сути то же самое, но проще.

Или использовать модуль ast и такой синтаксис:
query("age_days < 7 and size > 10_000_000 and suffix == '.log'")


А может вообще что-то lisp-подобное:
query(("and", ("age_days", ">", 7),
("size", ">", 10_000_000),
("suffix", "==", ".log")))


Или добавить callable-объекты, которые можно передавать в фильтры, получится куда более нативно:
dir = pathlib.Path('/var')
for file in filter(OlderThan(days=7) & LargerThan(MB=10),dir.rglob("*")):
print(file.as_posix())


Лично мне, админу канала @zen_of_python, последний вариант кажется самым удобным. Не самый привычный синтаксис, но читается однозначно. И возможность задавать время и размер файлов в привычных единицах — тоже плюс.

Если для ускорения добавить конкурентность и кэширование, как сделал автор исходной библиотеки, то получится прекрасный инструмент.

А какой стиль вам больше понравился? Как бы вы реализовали?
🔥6