diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-07-30 12:50:38 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-07-30 12:50:38 -0400 |
commit | 5a86dba402d6d20aa70b8c6152a5a0564b896b4b (patch) | |
tree | 66856e4081c0b969606e6cae7937a832b988aa4e /lib/sqlalchemy/util/compat.py | |
parent | 0bf33068f43c75cdaac3bf25cf918847f07bf330 (diff) | |
download | sqlalchemy-5a86dba402d6d20aa70b8c6152a5a0564b896b4b.tar.gz |
- workaround removal of nested() in py3k
Diffstat (limited to 'lib/sqlalchemy/util/compat.py')
-rw-r--r-- | lib/sqlalchemy/util/compat.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/sqlalchemy/util/compat.py b/lib/sqlalchemy/util/compat.py index 7f2238a13..972fda667 100644 --- a/lib/sqlalchemy/util/compat.py +++ b/lib/sqlalchemy/util/compat.py @@ -226,3 +226,37 @@ def with_metaclass(meta, *bases): return type.__new__(cls, name, (), d) return meta(name, bases, d) return metaclass('temporary_class', None, {}) + + +from contextlib import contextmanager + +try: + from contextlib import nested +except ImportError: + # removed in py3k, credit to mitsuhiko for + # workaround + + @contextmanager + def nested(*managers): + exits = [] + vars = [] + exc = (None, None, None) + try: + for mgr in managers: + exit = mgr.__exit__ + enter = mgr.__enter__ + vars.append(enter()) + exits.append(exit) + yield vars + except: + exc = sys.exc_info() + finally: + while exits: + exit = exits.pop() + try: + if exit(*exc): + exc = (None, None, None) + except: + exc = sys.exc_info() + if exc != (None, None, None): + reraise(exc[0], exc[1], exc[2]) |