Домой

Последняя активность

  

Python контекстный менеджер (with statement )

PyDeKolt avatar PyDeKolt (0) [#] (27.05.2013 / 15:50)
В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор with.

Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, независимо от возбуждённых в блоке исключений или операторов return: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.

  1. # Для Python < 2.6
  2. # from __future__ import with_statement as with
  3. from threading import Lock
  4. with Lock():
  5. print u"Блок кода охраняемый блокировкой"
  6. with open('test.txt', 'a') as f:
  7. f.write('Hello world!slash_JOHNCMSrslash_JOHNCMSn')

Пример класса реализующего протокол контекстного менеджера.
  1. class Example(object):
  2. def __enter__(self):
  3. """
  4. В момент выполнения with [var] as [varname],
  5. переменной [varname] приваивается результат работы этой функции
  6. """
  7. return 'Hello world!'
  8. def __exit__(self, type, value, traceback):
  9. """
  10. type - тип исключения
  11. value - его значение
  12. traceback - трассировочная информация
  13. Возвращает True - если исключение было обработано, иначе - False
  14. """
  15. if type:
  16. print '!!!Bug'
  17. return False
  18. with Example() as expl:
  19. print expl
  20. raise ValueError # Если возникла ошибка выполняем __exit__
  21. # Hello world!
  22. # !!!Bug

Контекстный менеджер на основе функции.
  1. from contextlib import contextmanager
  2. @contextmanager
  3. def example():
  4. try:
  5. yield 'Hello world'
  6. finally:
  7. pass # закрытие файлов и соединений
  8. with example() as expl:
  9. print expl
  10. # Hello world!

* Учебник онлайн для Python
  Всего: 1

Зарегистрируйтесь и сможете комментировать все темы. Кнопочка вверху
Фильтр по автору
Скачать тему

В Форум

Новые вверху
Statok.net Рейтинг@Mail.ru
spywap.nettop-sid.ru
Яндекс.Метрика