Русский
Открыть в Telegram

Пост Условное использование менеджеров контекста обычно доставляет неудобства: нельзя просто разместить with внутри блока if,…

3 июня 2026
Б
Библиотека Python разработчика | Книги по питону
Условное использование менеджеров контекста обычно доставляет неудобства: нельзя просто разместить with внутри блока if, не заключив туда весь блок with. Это часто приводит к дублированию кода: def print_whole_file( *, path: Optional[str] = None, file_obj: Optional[TextIO] = None ): assert path or file_obj if path: with open(path) as f: print(f.read(), end='') else: print(file_obj.read(), end='') Способ борьбы с этой проблемой — использовать ExitStack и вызывать enter_context внутри if: def print_whole_file( *, path: Optional[str] = None, file_obj: Optional[TextIO] = None ): assert path or file_obj with ExitStack() as stack: if path: file_obj = stack.enter_context( open(path) ) print(file_obj.read(), end='') Однако более очевидный способ достичь того же — использовать тривиальные менеджеры контекста, которые ничего не делают, когда они не нужны, вместо «настоящих». Начиная с Python 3.7, их можно получить с помощью contextlib.nullcontext: def print_whole_file( *, path: Optional[str] = None, file_obj: Optional[TextIO] = None ): assert path or file_obj if path: context = open(path) else: context = nullcontext(file_obj) with context as f: print(f.read(), end='') 📲 Мы в MAX 👉@BookPython
9 · 1.5K ·

Рядом в ленте

ББиблиотека Python разработчика | Книги по питонуВ списковых включениях (list comprehensions) может быть больше одного цикла for и условия if: In : [(x, y) for x in range(3) for y in range(3)] Out: [ (0, 0), (ББиблиотека Python разработчика | Книги по питонуВ Python функция range() определяет все целые числа в полуоткрытом интервале. То есть range(2, 10) математически означает [2, 10), или, говоря на языке Python:
это сообщение
ББиблиотека Python разработчика | Книги по питонуЛюбая выполняющаяся корутина asyncio может быть отменена с помощью метода cancel(). В корутину будет выброшено исключение CancelledError, что приведёт к её завеББиблиотека Python разработчика | Книги по питону🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash
ББиблиотека Python разработчика | Книги по питонуБиблиотека Python разработчика | Книги по питону@BookPython · канал · Технологии
17 943подписчиков725средний охват поста
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Границы индекса · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем