diff options
Diffstat (limited to 'Lib/test/contextmanager.py')
-rw-r--r-- | Lib/test/contextmanager.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Lib/test/contextmanager.py b/Lib/test/contextmanager.py new file mode 100644 index 0000000..0ebf646 --- /dev/null +++ b/Lib/test/contextmanager.py @@ -0,0 +1,34 @@ +class GeneratorContextManager(object): + def __init__(self, gen): + self.gen = gen + + def __context__(self): + return self + + def __enter__(self): + try: + return self.gen.next() + except StopIteration: + raise RuntimeError("generator didn't yield") + + def __exit__(self, type, value, traceback): + if type is None: + try: + self.gen.next() + except StopIteration: + return + else: + raise RuntimeError("generator didn't stop") + else: + try: + self.gen.throw(type, value, traceback) + except (type, StopIteration): + return + else: + raise RuntimeError("generator caught exception") + +def contextmanager(func): + def helper(*args, **kwds): + return GeneratorContextManager(func(*args, **kwds)) + return helper + |