blob: 0ebf646f91951e05fa68d3e8c63fb3c9f8720aff [file] [log] [blame]
Guido van Rossumc2e20742006-02-27 22:32:47 +00001class GeneratorContextManager(object):
2 def __init__(self, gen):
3 self.gen = gen
4
5 def __context__(self):
6 return self
7
8 def __enter__(self):
9 try:
10 return self.gen.next()
11 except StopIteration:
12 raise RuntimeError("generator didn't yield")
13
14 def __exit__(self, type, value, traceback):
15 if type is None:
16 try:
17 self.gen.next()
18 except StopIteration:
19 return
20 else:
21 raise RuntimeError("generator didn't stop")
22 else:
23 try:
24 self.gen.throw(type, value, traceback)
25 except (type, StopIteration):
26 return
27 else:
28 raise RuntimeError("generator caught exception")
29
30def contextmanager(func):
31 def helper(*args, **kwds):
32 return GeneratorContextManager(func(*args, **kwds))
33 return helper
34