четверг, 30 июля 2015 г.

Протокол управления контекстом

Схема работы инструкции with:
  1. Производится вычисление выражения, возвращающего объект, известный как менеджер контекста, который должен иметь методы __enter__ и __exit__.
  2. Вызывается метод __enter__ менеджера контекста. Возвращаемое значение метода присваивается переменной в предложении as, если оно имеется, в противном случае значение просто уничтожается.
  3. Затем выполняется блок программного кода, вложенный в инструкцию with.
  4. Если при выполнении блока возбуждается исключение, вызывается метод __exit__(тип, значение, диагностическая информация), которому передается подробная информация об исключении. Если этот метод возвращает ложное значение, исключение возбуждается повторно, в противном случае исключение деактивируется. Обычно исключение следует возбуждать повторно, чтобы оно могло выйти за пределы инструкции with.
  5. Если в блоке with исключение не возникает, метод __exit__ все равно вызывается, но в аргументах тип, значение, и диагностическая информация ему передается значение None.
GitHub
Источник: Лутц М. Изучаем Python, 4-е издание. — Пер. с англ. — СПб.: Символ-Плюс, 2011, стр. 950.