exec behaviour

N. Pourcelot baudelaire_2c at yahoo.fr
Sat Nov 5 00:22:34 CET 2005


Thanks for you reply.
I added locals() to my exec statment, so it worked, but I wasn't so sure 
about my interpretation of the problem.


Fredrik Lundh wrote:
> N. Pourcelot wrote:
> 
> 
>>I can't understand some specific behaviour of the exec statment.
>>
>>For example, say that I create such a class A :
>>
>>class A:
>>    def __init__(self):
>>        self.n = 3
>>        self.m = None
>>    def h(self, ini):
>>        n = self.n
>>        m = self.m
>>        if ini: exec("def m(x): return n+x"); self.m=m
>>        else: m(7)
>>
>>Now :
>>obj = A()
>>obj.h(1)
>>obj.h(0)
>>
>>I get :
>>
>>Traceback (most recent call last):
>>  File "<input>", line 1, in ?
>>  File "<input>", line 9, in h
>>  File "<string>", line 1, in m
>>NameError: global name 'n' is not defined
> 
> 
> exec only supports local and global scopes; the "n" inside the exec statement
> is a not a local, so it's assumed to be a global variable.
> 
> (Python's lexical scoping requires the compiler to look for free variables in inner
> scopes before generating code for the outer scope; it cannot do that for exec, for
> obvious reasons).
> 
> </F> 
> 
> 
> 



More information about the Python-list mailing list