On 7/16/2013 2:04 PM, Ian Kelly wrote:

The documentation appears to be wrong.  It says:

"""
If a name binding operation occurs anywhere within a code block, all
uses of the name within the block are treated as references to the
current block. This can lead to errors when a name is used within a
block before it is bound. This rule is subtle. Python lacks
declarations and allows name binding operations to occur anywhere
within a code block. The local variables of a code block can be
determined by scanning the entire text of the block for name binding
operations.
"""
I agree that there is a problem.
http://bugs.python.org/issue18478

But this only applies to function blocks, not the general case.  In
general, I believe it is more accurate to say that a variable is local
to the block if its name is found in the locals() dict.

That is not true for functions, where names are classified as local *before* being added to the locals dict. (Actually, names are usually not added to the locals dict until locals() is called to update it).

It would be better to say that names are local if found in the local namespace, and consider that names are added to a function local namespace (which is *not* the local() dict) when classified (before being bound), but otherwise only when bound.


  That normally
won't be true until the variable has been bound.  Any references prior
to that will look for a global variable.

At module scope, globals() == locals(). But feel free to suggest a different fix for the issue than I did.

--
Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to