On Thursday, April 25, 2013 11:27:37 PM UTC+2, Alastair Thompson wrote:
> I am completely baffled by the behavior of this code with regards to the 
> evaluation order of namespaces when assigning the class attributes.  Both 
> classes are nested within a function I called whywhywhy.
[snip weird namespace problem]

Hi,

I am not a namespace expert, but I think the following example shows the same 
problem in an easier way without any classes, and gives a more helpful error 
message:

In [1]: a = 123
In [2]: def f():
   ...:     print a
   ...:     b = 456

In [3]: f()
123

In [4]: def g():
   ...:     print a
   ...:     a = 456

In [5]: g()
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
/home/xxx/<ipython-input-5-d65ffd94a45c> in <module>()
----> 1 g()

/home/xxx/<ipython-input-4-c304da696fc2> in g()
      1 def g():
----> 2     print a
      3     a = 456
      4 

UnboundLocalError: local variable 'a' referenced before assignment


My guess is that in f(), the compiler sees no definition of a, so it assumes is 
must come from the outer namespace. In g(), however, it sees on the second line 
that a is uses as an assignment target, so it makes the variable a local. When 
it is executed, it rightfully complains that the local variable is not yet 
defined. A smarter compiler might prevent this problem, but then again a 
smarter programmer would not have local and global variables with the same name.

In your example, something similar is probably happening, since you assign 
something to third inside example2, thereby making it 'local'. Since you are 
dealing with classes, the error message is probably not so clear (but whywhywhy 
would you define a class inside a function?) Does that make sense?

HTH,
Bas
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to