Vitja Makarov, 15.08.2011 07:49:
2011/8/15 Vitja Makarov:
When creating python-class dict it seems that CPython first looks at
dict then at globals:

A = 1
class X:
    A = A

def y():
    A = 3
    class Y:
        A = A
    return Y
Y = y()

print(X.A, Y.A)

Will print: 1, 1
And not: 1, 3

I didn't find documentation for this but if I'm correct that should be
easy to fix issue in Cython.

Now for this code cython reports compile-time error: local variable
referenced before assignment

One more interesting example:

A = 1
def foo(a):
     A = a
     class X:
         a = A
         A = A
     class Y:
         a = A
     return X, Y
X, Y = foo(666)
print X.a, X.A, Y.a

This prints "1 1 666". However, at least to me, the most surprising thing is this:

  >>> A = 1
  >>> def foo(x):
  ...     A = x
  ...     class X:
  ...         a = A
  ...     return X
  ...
  >>> foo(2).a
  2
  >>> def foo(x):
  ...     A = x
  ...     class X:
  ...         A = A
  ...     return X
  ...
  >>> foo(2).A
  1

That looks pretty sick, but I would guess that the 'reasoning' behind this is that the second case contains an assignment to A inside of the class namespace, and assignments make a variable local to a scope, in this case, the function scope. Therefore, the A on the rhs is looked up in that scope as well. However, this is just a hand waving guess. I just asked on c.l.py, we may get a pointer to relevant documentation that way.

Also see this bug:

http://trac.cython.org/cython_trac/ticket/671

Stefan
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to