Skip to content

Instantly share code, notes, and snippets.

@internetimagery
Last active May 2, 2020 00:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save internetimagery/4f975cb828f26e58eee975a5fb78ac33 to your computer and use it in GitHub Desktop.
Save internetimagery/4f975cb828f26e58eee975a5fb78ac33 to your computer and use it in GitHub Desktop.
Context manager for your context managers
import sys
import contextlib
@contextlib.contextmanager
def context_manager_manager(*managers):
for manager in managers:
manager.__enter__()
err = (None, None, None)
try:
yield
except Exception:
err = sys.exc_info()
raise
finally:
for manager in reversed(managers):
manager.__exit__(*err)
if __name__ == "__main__":
@contextlib.contextmanager
def demo(message):
print(" IN ->", message)
yield
print("OUT ->", message)
with context_manager_manager(
demo("one"), demo(" two"), demo(" three")
):
print(" ==== INSIDE! ====")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment