Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
Образование · 3 июня 2026 г.
Условное использование менеджеров контекста обычно доставляет неудобства: нельзя просто... — 3 июня 2026 г. в 05:53:53.167
Условное использование менеджеров контекста обычно доставляет неудобства: нельзя просто разместить 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='') 👉 @BookPython

