From: Andrew S. <str...@as...> - 2005-01-08 00:38:38
|
A few weeks ago (on Dec 18), I send an email to the matplotlib-devel list indicating that "from pylab import *" overrides some builtin functions, such as min() and max(). [1] This results from pylab enlarging its namespace greatly with statements like "from numerix import *" and "from mlab import *". In general this is a good thing, but it seems numarray.linear_algebra.mlab (amongst possibly others) overrides some builtin names. Although I don't see the benefit in this design for numarray.linear_algebra.mlab, I can live with it, since I never do "from numarray.linear_algebra.mlab import *". However, I (and many others here, I suspect) would like to frequently use "from pylab import *", and it really pisses me off when I discover that various builtins are overridden, causing mysterious errors that may be hard to track down. So, I offer the following patch [2] to pylab.py which fixes this. I hereby ask for your feedback indicating if you are happy with the current behavior, or if you prefer that pylab does not override builtins. (Also, if you have a better way, that would be appreciated, too.) You may check your own systems using a little script I wrote while testing this. [3] Cheers! Andrew [1] http://sourceforge.net/mailarchive/forum.php?thread_id=6190717&forum_id=36187 [2] Patch to pylab.py, to be inserted anywhere after the last "from blah import *", e.g. line 216. # restore builtin functions which may have been overridden min = getattr(sys.modules['__builtin__'],'min') max = getattr(sys.modules['__builtin__'],'max') sum = getattr(sys.modules['__builtin__'],'sum') round = getattr(sys.modules['__builtin__'],'round') abs = getattr(sys.modules['__builtin__'],'abs') [3] Script to test for overriding of builtin names: import sys def check_globals(): for key in globals().keys(): if key in dir(sys.modules['__builtin__']): if globals()[key] != getattr(sys.modules['__builtin__'],key): print "'%s' was overridden in globals()."%key print 'before pylab import' check_globals() print from pylab import * print 'after pylab import' check_globals() print |