Clearing globals in CPython

Mark Lawrence breamoreboy at yahoo.co.uk
Wed Oct 1 20:17:03 CEST 2014


On 01/10/2014 17:00, Steven D'Aprano wrote:
> Out of curiosity, I ran:
>
> globals().clear()
>
> in the interactive interpreter. It broke much more than I expected!
> Built-ins were no longer available, and import stopped working.
>
> I expected that global variables would be all lost, but built-ins would
> remain, since they don't live in the global namespace. I was wrong:
>
>>>> globals().clear()
>>>> x = len([])
> Traceback (most recent call last):
>    File "<stdin>", line 1, in <module>
> NameError: name 'len' is not defined
>
> The reason, I think, is that CPython has a special __builtins__ global
> variable that the interpreter uses to access built-in functions. What
> *appears* to be happening is that if that __builtins__ global is missing,
> CPython can not access the built-ins.
>
> (Supporting this interpretation: IronPython, like CPython, has a
> __builtins__ global, and behaves the same when the globals() are cleared.
> Jython, which does not have a __builtins__ global, does not.)
>
> Well that's okay, I thought to myself, I'll just import the built-in
> functions:
>
>>>> from builtins import len  # use '__builtin__' in Python 2
> Traceback (most recent call last):
>    File "<stdin>", line 1, in <module>
> ImportError: __import__ not found
>
> Oops.
>
> So, with no built-ins available, import no longer works. That makes things
> rather tricky.
>
> Obviously the easiest way to recover is to exit the current session and
> restart it, but as a challenge, can we recover from this state?
>
>

We obviously need a Restart Command.

-- 
My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.

Mark Lawrence




More information about the Python-list mailing list