Unexpected python exception
Diez B. Roggisch
deets at nospam.web.de
Wed Nov 11 06:21:55 EST 2009
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
More information about the Python-list
mailing list