Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
%with / %endwith IPython extension
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
# -*- coding: utf-8 -*-
%with and %endwith magics.
# Imports
import re
from IPython.core.error import UsageError
from IPython.core.magic import Magics, magics_class, line_magic
# Functions and classes
class WithMagics(Magics):
"""Provides the %with and %endwith magics."""
def __init__(self, shell):
super(WithMagics, self).__init__(shell)
self._re_with = re.compile(r'^(?P<code>.*)\s+as\s+(?P<name>[_A-Za-z][_A-Za-z0-9]*):$')
self._contexts = []
def with_(self, line=''):
m = self._re_with.match(line)
if not m:
raise UsageError("Error parsing statement.")
code ='code')
name ='name')
shell =
context = eval(code, shell.user_global_ns, shell.user_ns)
obj = context.__enter__()
print("Context manager %s started" % name)
# Return value to the user
shell.user_ns[name] = obj
self._contexts.append((name, context))
def endwith(self, line=''):
name, context = self._contexts.pop()
print("Context manager %s ended" % name)
context.__exit__(None, None, None)
def load_ipython_extension(ip):
"""Load the extension in IPython."""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.