Richard Purdie schrieb:
I've been having problems with an unexpected exception from python which
I can summarise with the following testcase:

def A():
    import __builtin__
    import os

    __builtin__.os = os

def B():
    os.stat("/")
    import os

A()
B()

which results in:

Traceback (most recent call last):
  File "./test.py", line 12, in <module>
    B()
  File "./test.py", line 8, in B
    os.stat("/")
UnboundLocalError: local variable 'os' referenced before assignment

If I remove the "import os" from B(), it works as expected.

From what I've seen, its very unusual to have something operate
"backwards" in scope in python. Can anyone explain why this happens?

As the import-statement in a function/method-scope doesn't leak the imported names into the module scope, python treats them as locals. Which makes your code equivalent to


x = 1000

def foo():
    print x
    x = 10

Throws the same error. The remedy is to inform python that a specific name belongs to global scope, using the "global"-statement.

def foo():
    global x
    print x
    x = 10


Beware though that then of course *assigning* to x is on global level. This shouldn't be of any difference in your case though, because of the import-only-once-mechanics of python.

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

Reply via email to