Is this a bug?

Jack Bates tdhfwh at nottheoilrig.com
Tue Jul 16 11:25:35 EDT 2013


On 15/07/13 09:13 AM, Joshua Landau wrote:
> On 15 July 2013 16:50, Jack Bates <tdhfwh at nottheoilrig.com> wrote:
>> Hello,
>>
>> Is the following code supposed to be an UnboundLocalError?
>> Currently it assigns the value 'bar' to the attribute baz.foo
>>
>>     foo = 'bar'
>>     class baz:
>>        foo = foo
>
> If so, then no. Assignments inside class bodies are special-cased in
> Python. This is because all assignments refer to properties of "self"
> on the LHS but external things too on the RHS. This is why you can do
> "def x(): ..." instead of "def self.x(): ..." or some other weird
> thing. There's also some extra special stuff that goes on.
>
> In order to make this an UnboundLocalError, lots of dramatic and
> unhelpful changes would have to take place, hence the current
> behaviour. The current behaviour is useful, too.

Ah, thank you Chris Angelico for explaining how this is like what 
happens with default arguments to a function and Joshua Landau for 
pointing out how assignments inside class bodies refer to properties of 
"self" on the LHS. It makes sense now. Only I'm struggling to find where 
the behavior is defined in the language reference. Can someone please 
help point me to where in the language reference this is discussed? I've 
been hunting through the section on naming and binding:

 
http://docs.python.org/3/reference/executionmodel.html#naming-and-binding



More information about the Python-list mailing list