Recover handle to shadowed builtin?

R

Roy Smith

I'm working with ipython's pylab mode, which replaces the builtin sum() with the one from numpy:

In [105]:
sum

Out[105]:
<function numpy.core.fromnumeric.sum>

Is there any way to recover a reference to the builtin sum()?
 
R

Roy Smith

I'm working with ipython's pylab mode, which replaces the builtin sum() =
with the one from numpy:
[...]
Is there any way to recover a reference to the builtin sum()?

Sigh. I figured this out myself. What you want is __builtins__.sum ...

BUT, not only does pylab overwrite sum(), it overwrites __builtins__
as well! Instead of a module, it's now a dict. You can still get at
the builtin sum, but you need to do __builtins__["sum"]

========================================================
$ ipython
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
Type "copyright", "credits" or "license" for more information.

IPython 0.12.1 -- An enhanced Interactive Python.
[...]
In [1]: type(__builtins__)
Out[1]: module
========================================================
$ ipython --pylab
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
Type "copyright", "credits" or "license" for more information.

IPython 0.12.1 -- An enhanced Interactive Python.
[...]
In [1]: type(__builtins__)
Out[1]: dict
========================================================

I am slowly coming to the conclusion that the best way to deal with
pylab is to not use it. Overwriting sum() with a different sum() I
can accept, as a useful shortcut. Overwriting __builtins__ seems like
wanton vandalism of the namespace.
 
C

Chris Angelico

BUT, not only does pylab overwrite sum(), it overwrites __builtins__
as well! Instead of a module, it's now a dict. You can still get at
the builtin sum, but you need to do __builtins__["sum"]

That probably means that it _only_ overrides the one from
__builtins__, which is the easiest way.

You're talking about something that's done at the interactive prompt.
It should be possible to play with sitecustomize.py to snapshot your
original builtins. Try this (untested):

# sitecustomize.py
import builtins
import sys
sys.original_builtins = builtins
sys.original_sum = sum


(or use __builtins__ or __builtin__ or whatever's appropriate for your version)

If snapshotting all of builtins doesn't work, snapshotting just sum
should. The key is executing code before pylab does its overwriting.

ChrisA
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top