Релиз Python 2.6, состоявшийся 1 октября, как-то прошел мимо меня. Поэтому, чтобы восполнить обнаружившийся пробел, я его скачал и установил. Первой пробой новой версии интерпретатора стала попытка написать контекст-менеджер и попробовать его с оператором with.
- from __future__ import print_function
- from random import random
- class Box:
- def __init__(self, i):
- print ("Construct Box")
- self.__I = i
- def getI(self):
- if random() > .5:
- return self.__I
- else:
- raise
- def setI(self, i):
- self.__I = i
- def __enter__(self):
- print ("Enter in Box, I = ", self.__I)
- return self
- def __exit__(self, type, value, tb):
- if tb is None:
- print ("All right, I = ", self.__I)
- else:
- print ("Aaaaa!!!")
- return True #Если не поставить, исключение пойдет выше
- with Box(3) as a:
- print (a.getI())
В случае нормального исхода, результат будет следующий:
Construct Box
Enter in Box, I = 3
3
All right, I = 3
Т.е., сначала вызывается конструктор, затем __enter__(), далее, собственно, выполняется код внутри блока with, а потом — __exit__(). В случае ошибки, получаем следующее:
Construct Box
Enter in Box, I = 3
Aaaaa!!!
Причем, если опустить строку return True, получим необработаное исключение:
Traceback (most recent call last):
File "C:/Python26/1", line 26, in
print (a.getI())
Empty
Комментариев нет:
Отправить комментарий