[Python-ideas] Tweaking closures and lexical scoping to include the function being defined
Greg Ewing
greg.ewing at canterbury.ac.nz
Mon Sep 26 08:56:02 CEST 2011
Nick Coghlan wrote:
> In current Python, ordinary named references can refer to one of 4 namespaces:
>
> ...
> - closure reference (stored in a cell object by the function that
> defined it, kept alive after the frame is recycled by references from
> still living inner functions that need it)
> ...
I think you're mixing up concepts and implementation here a
bit. Cells are an implementation detail. What's important is
which *namespace* the name is referring to:
- A 'global' declaration makes it refer to the module-level
namespace.
- A 'nonlocal' declaration makes it refer to some namespace in
between local and module-level (there may be more than one of
these, so I wouldn't say that there are only 4 namespaces).
Now, while the *value* of your proposed new kind of variable
would be stored as part of the function's closure, its *name*
would be part of the function's *local* namespace. Consider
this:
i = 88
def f():
nonlocal i = 17
print i
def g():
nonlocal i = 42
print i
f()
g()
print i
I'm assuming you intend that the two i's here would have nothing
to do with each other, or with the i in the enclosing scope, so
that the output from this would be
17
42
88
rather than
42
42
42
So, your proposed use of 'nonlocal' would actually be declaring
a name to be *local*. That strikes me as weird and perverse.
NOBODY-expects-the-spanish-nonlocal-declaration!-ly,
Greg
More information about the Python-ideas
mailing list