diff --git a/IPython/core/interactiveshell.py b/IPython/core/interactiveshell.py index fa9ce3c..bb857dc 100644 --- a/IPython/core/interactiveshell.py +++ b/IPython/core/interactiveshell.py @@ -983,11 +983,12 @@ class InteractiveShell(Configurable, Magic): ns.clear() # The main execution namespaces must be cleared very carefully, - # skipping the deletion of the __builtin__ key, because doing so would - # cause errors in many object's __del__ methods. + # skipping the deletion of the builtin-related keys, because doing so + # would cause errors in many object's __del__ methods. for ns in [self.user_ns, self.user_global_ns]: drop_keys = set(ns.keys()) drop_keys.discard('__builtin__') + drop_keys.discard('__builtins__') for k in drop_keys: del ns[k] diff --git a/IPython/core/tests/test_run.py b/IPython/core/tests/test_run.py index 12f634f..b4728c3 100644 --- a/IPython/core/tests/test_run.py +++ b/IPython/core/tests/test_run.py @@ -83,6 +83,22 @@ def doctest_run_builtins(): ....: """ +def doctest_reset_del(): + """Test that resetting doesn't cause errors in __del__ methods. + + In [2]: class A(object): + ...: def __del__(self): + ...: str("Hi") + ...: + + In [3]: a = A() + + In [4]: get_ipython().reset() + + In [5]: 1+1 + Out[5]: 2 + """ + # For some tests, it will be handy to organize them in a class with a common # setup that makes a temp file