diff options
Diffstat (limited to 'PYTHON/WITH.md')
| -rw-r--r-- | PYTHON/WITH.md | 28 |
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 |
