Unexpected python exception

Eduardo Lenz lenz at joinville.udesc.br
Wed Nov 11 17:49:02 CET 2009


Em Qua 11 Nov 2009, às 03:21:55, Diez B. Roggisch escreveu:
> 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
> 

So...it should not work

def A():
     import __builtin__
     import os
     __builtin__.os = os

A()
os.stat("/")

but it does.  Why ? B() cannot see the import, but the global level can ?

Thanks.

Eduardo.

-- 
Esta mensagem foi verificada pelo sistema de antivírus e
 acredita-se estar livre de perigo.




More information about the Python-list mailing list