[Python-Dev] Re: More int/long integration issues

Guido van Rossum guido@python.org
Thu, 13 Mar 2003 19:22:09 -0500


> > and that there's no definition of range other than the built-in one
> > (this requires a subtle change of language rules); it can then
> > substitute an internal equivalent to xrange().
> 
> That sounds good. What sort of subtle language change
> do you have in mind which would permit this deduction?

An official prohibition on inserting names in other namespaces that
shadow built-ins.  The prohibition needn't be enforced (although that
would be nice).  A program that does

  import foomod
  foomod.range = ...

would be invalid, but an implementation might not be able to catch all
cases, e.g.

  import foomod
  foomod.__dict__['range'] = ...

It could be enforced, mostly, by making a module's __dict__ attribute
return a read-only proxy like a new-style class's __dict__ attribute
does, and putting an explicit ban on setting certain names in the
module setattr implementation.  But the module itself could also play
games, e.g. it could do

  exec "range = ..." in globals()

Another module could also do

  from foomod import f # a function
  f.func_globals['range'] = ...

All these things would be illegal without necessarily being enforced.
(The only way I see for total enforcement would be to change the dict
implementation to trap certain assignments.)

BTW,

  import foomod
  foomod.foo = ...

would still be allowed -- it's only setting previously unset built-in
names (or maybe built-in names that are known to be used by the
module) that would be prohibited.

Also, foomod could explicit allow setting an attribute by doing
something like

  range = range # copy the built-in into a global

to disable the optimization.  I.e. setting something that's already
set should always be allowed.

--Guido van Rossum (home page: http://www.python.org/~guido/)