summaryrefslogtreecommitdiff
path: root/PYTHON/WITH.md
diff options
context:
space:
mode:
Diffstat (limited to 'PYTHON/WITH.md')
-rw-r--r--PYTHON/WITH.md28
1 files changed, 28 insertions, 0 deletions
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