On 1/2/2011 10:18 PM, Guido van Rossum wrote:
My proposed way out of this conundrum has been to change the language
semantics slightly so that global names which (a) coincide with a
builtin, and (b) have no explicit assignment to them in the current
module, would be fair game for such optimizations, with the
understanding that the presence of e.g. "len = len" anywhere in the
module (even in dead code!) would be sufficient to disable the
optimization.
I believe this amounts to saying
1) Python code executes in three scopes (rather than two): global
builtin, modular (misleadingly call global), and local. This much is a
possible viewpoint today.
2) A name that is not an assignment target anywhere -- and that matches
a builtin name -- is treated as a builtin. This is the new part, and it
amounts to a rule for entire modules that is much like the current rule
for separating local and global names within a function. The difference
from the global/local rule would be that unassigned non-builtin names
would be left to runtime resolution in globals.
It would seem that this new rule would simplify the lookup of module
('global') names since if xxx in not in globals, there is no need to
look in builtins. This is assuming that following 'len=len' with 'del
len' cannot 'unmodularize' the name.
For the rule to work 'retroactively' within a module as it does within
functions would require a similar preliminary pass. So it could not work
interactively. Should batch mode main modules work the same as when
imported?
Interactive mode could work as it does at present or with slight
modification, which would be that builtin names within functions, if not
yet overriden, also get resolved when the function is compiled.
--
Terry Jan Reedy
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com