Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add drop_by_id method to shell, to remove variables added by extensions. #889

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 18 additions & 0 deletions IPython/core/interactiveshell.py
Expand Up @@ -1264,6 +1264,24 @@ def push(self, variables, interactive=True):
else:
for name,val in vdict.iteritems():
config_ns[name] = val

def drop_by_id(self, variables):
"""Remove a dict of variables from the user namespace, if they are the
same as the values in the dictionary.

This is intended for use by extensions: variables that they've added can
be taken back out if they are unloaded, without removing any that the
user has overwritten.

Parameters
----------
variables : dict
A dictionary mapping object names (as strings) to the objects.
"""
for name, obj in variables.iteritems():
if name in self.user_ns and self.user_ns[name] is obj:
del self.user_ns[name]
self.user_ns_hidden.pop(name, None)

#-------------------------------------------------------------------------
# Things related to object introspection
Expand Down
15 changes: 14 additions & 1 deletion IPython/core/tests/test_interactiveshell.py
Expand Up @@ -179,4 +179,17 @@ def test_bad_custom_tb_return(self):
finally:
io.stderr = save_stderr


def test_drop_by_id(self):
ip = get_ipython()
myvars = {"a":object(), "b":object(), "c": object()}
ip.push(myvars, interactive=False)
for name in myvars:
assert name in ip.user_ns, name
assert name in ip.user_ns_hidden, name
ip.user_ns['b'] = 12
ip.drop_by_id(myvars)
for name in ["a", "c"]:
assert name not in ip.user_ns, name
assert name not in ip.user_ns_hidden, name
assert ip.user_ns['b'] == 12
ip.reset()