From e5abc1fe99340b979b18864d978179f71fe8f5c5 Mon Sep 17 00:00:00 2001 From: vlapa Date: Sat, 13 Jun 2026 20:33:26 +0300 Subject: First --- PYTHON/WITH.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 PYTHON/WITH.md (limited to 'PYTHON/WITH.md') diff --git a/PYTHON/WITH.md b/PYTHON/WITH.md new file mode 100644 index 0000000..437e03d --- /dev/null +++ b/PYTHON/WITH.md @@ -0,0 +1,28 @@ +Ещё одна мощная и идиоматичная конструкция в Python — это менеджеры контекста и оператор ==with==. Они кардинально упрощают работу с ресурсами, которые требуют обязательной "очистки" после использования, например, файлы, сетевые соединения или блокировки потоков. + +Представьте, что вы открываете файл для записи. Крайне важно его потом закрыть, иначе данные могут не сохраниться, а файловый дескриптор останется занят. Классический, но многословный способ гарантировать закрытие — использовать `try...finally: +```sh +f = open('my_file.txt', 'w') +try: +    f.write('Важные данные!') +    # ... тут может произойти ошибка +finally: +    f.close() # Закроется в любом случае +``` + +Работает, но выглядит громоздко. Python предлагает элегантную альтернативу с with: +```sh +with open('my_file.txt', 'w') as f: +    f.write('Важные данные!') +    # ... тут тоже может произойти ошибка +# Как только блок `with` завершается (нормально или из-за ошибки), +# Python АВТОМАТИЧЕСКИ вызывает f.close()! +``` + +**В чём магия with?** + +Объекты, используемые с with (как тот, что возвращает open()), реализуют так называемый "протокол менеджера контекста". У них есть специальные методы (__enter__ и __exit__). Оператор with вызывает __enter__ при входе в блок и гарантированно вызывает __exit__ при выходе из блока, передавая туда информацию об исключениях, если они были. Именно в __exit__ и происходит освобождение ресурса (закрытие файла). + + + +Оператор with — это стандарт де-факто для управления ресурсами в Python. Он делает код не только короче, но и значительно безопаснее и понятнее. \ No newline at end of file -- cgit v1.2.3