blob: b5030e07fc9158451a684e040b89bef35b3f6290 [file] [log] [blame]
Tim Peters400cbc32006-02-28 18:44:41 +00001import sys
2from collections import deque
3
4
5class nested(object):
6 def __init__(self, *contexts):
7 self.contexts = contexts
8 self.entered = None
9
10 def __context__(self):
11 return self
12
13 def __enter__(self):
14 if self.entered is not None:
15 raise RuntimeError("Context is not reentrant")
16 self.entered = deque()
17 vars = []
18 try:
19 for context in self.contexts:
20 mgr = context.__context__()
21 vars.append(mgr.__enter__())
22 self.entered.appendleft(mgr)
23 except:
24 self.__exit__(*sys.exc_info())
25 raise
26 return vars
27
28 def __exit__(self, *exc_info):
29 # Behave like nested with statements
30 # first in, last out
31 # New exceptions override old ones
32 ex = exc_info
33 for mgr in self.entered:
34 try:
35 mgr.__exit__(*ex)
36 except:
37 ex = sys.exc_info()
38 self.entered = None
39 if ex is not exc_info:
40 raise ex[0], ex[1], ex[2]