On Jul 12, 2010, at 15:55 , Alf P. Steinbach /Usenet wrote:
> * Rami Chowdhury, on 13.07.2010 00:14:
>> Perhaps I'm misunderstanding, but ...
>> 
>> On Jul 12, 2010, at 13:57 , Alf P. Steinbach /Usenet wrote:
>>> 
>>> Existence of a variable means, among other things, that
>>> 
>>>  * You can use the value, with guaranteed effect (either unassigned 
>>> exception
>>>    or you get a proper value)
>> 
>> Surely by that definition any variable in any Python program "exists" -- you
>> are guaranteed to get one of NameError, UnboundLocalError, or a value. That
>> seems to argue away the meaning of the word entirely, and renders it not
>> particularly useful.
> 
> No, you're conflating non-existence (NameError) with accessing the value of 
> an existing but unassigned variable (UnboundLocalError). It is like arguing 
> that vacuum is the same as cement because sticking your head into it for ten 
> minutes or so yields an effect  --  you're dead  --  that in many ways is 
> just about the same.

Right -- but you're playing with the definition of "existence" there, and since 
you're not using it quite consistently, I wasn't sure what you meant. Your 
discussion of the language reference below helps clear it up.

> 
>>> How the Python implementation implements that is an implementation detail.
>>> 
>>> In short, how CPython does things is completely irrelevant to the language's
>> semantics, so you're conflating things here.
>>> 
>> 
>> As I'd understood the previous discussion, it is the CPython implementation
>> that reserves local names and produces UnboundLocalErrors. The language
>> semantics don't call for it, and another implementation might choose to 
>> handle
>> function locals the same way as globals, through a namespace dictionary -- in
>> which case the variable *wouldn't* exist in any way, shape, or form until it
>> was assigned to.
>> 
>> What am I getting wrong here?
> 
> The bit about the language semantics not specifying the effect.
> 
> From the 3.1.1 language reference ยง4.1:
> 
> "When a name is not found at all, a NameError exception is raised. If the 
> name refers to a local variable that has not been bound, a UnboundLocalError 
> exception is raised. UnboundLocalError is a subclass of NameError."
> 
> And it goes on to elaborate on that, a little later:
> 
> "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."

Ah, interesting. Thank you for pointing that out -- I didn't know that. I 
notice the same paragraph is in the 2.7 reference, so it presumably holds for 
2.x implementations as well.

> This is the usual reaction of the religious when exposed to reality.
> 
> Cheers & hth.

It does, thank you. Although the repeated references to the "religious" and 
their "refusal to accept reality" are less than helpful.

> 
> -- 
> blog at <url: http://alfps.wordpress.com>
> -- 
> http://mail.python.org/mailman/listinfo/python-list

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

Reply via email to