exec and locals
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Wed Feb 26 08:15:25 EST 2014
I have to dynamically generate some code inside a function using exec,
but I'm not sure if it is working by accident or if I can rely on it.
Here is a trivial example:
py> def spam():
... exec( """x = 23""" )
... return x
...
py> spam()
23
(My real example is more complex than this.)
According to the documentation of exec, I don't think this should
actually work, and yet it appears to. The documentation says:
The default locals act as described for function locals()
below: modifications to the default locals dictionary should
not be attempted. Pass an explicit locals dictionary if you
need to see effects of the code on locals after function
exec() returns.
http://docs.python.org/3.4/library/functions.html#exec
I *think* this means that if I want to guarantee that a local variable x
is created by exec, I need to do this instead:
py> def eggs():
... mylocals = {}
... exec( """x = 23""", globals(), mylocals)
... x = mylocals['x']
... return x
...
py> eggs()
23
The fact that it works in spam() above is perhaps an accident of
implementation? Yes no maybe?
--
Steven
More information about the Python-list
mailing list