[Python-3000] __builtin__ and __builtins__
Ka-Ping Yee
python at zesty.ca
Mon Mar 12 01:37:51 CET 2007
For a long time __builtin__ and __builtins__ have mystified me.
Usually I end up guessing -- in any given namespace, one of the
two will exist, and it will either be a module or a dictionary --
but I never committed to memory which name or type to expect.
A little investigation reveals:
In module __main__:
__builtins__ is a reference to module __builtin__.
__builtin__ only exists if you import it.
In any other module:
__builtins__ is a reference to module __builtin__'s __dict__.
__builtin__ only exists if you import it.
In order of increasing boldness, here are some possible fixes:
1. Make __builtins__ always refer to a dict. I think there's
quite a strong argument for this -- in general, you should
be able to take the same code and run it as a script or a
module with similar behaviour.
2. Rename __builtins__ so it isn't so easily mistaken for __builtin__.
I haven't thought of any awesome names to propose.
3. Unify the roles of the names __builtins__ and __builtin__ --
having both is too confusing.
a. Instead of putting __builtins__ into every module namespace,
import __builtin__ into every module namespace.
b. Do the last resort for name lookups in
__builtin__.__dict__ instead of __builtins__.
c. To make this no slower than it is today, make each module
cache a pointer to its __builtin__.__dict__ and update
that pointer when __builtin__ is reassigned.
Going all the way to #3 would be the cleanest, I think. Maybe
there are other solutions for unifying the two, as well -- any ideas?
-- ?!ng
More information about the Python-3000
mailing list