[issue4315] On some Python builds, exec in a function can't create shadows of variables if these are declared "global" in another function of the same module

Silas S. Brown report at bugs.python.org
Thu Nov 13 17:10:28 CET 2008


Silas S. Brown <ssb22 at users.sourceforge.net> added the comment:

Sorry, I accidentally posted the workaround code instead of the bug
example.  This is what I should have posted:

setting1 = "val1"
setting2 = "val2"

def dummy():
    global setting1

def f(x):
    exec(x)
    return setting1,setting2

print f("setting1='new' ; setting2='new'")

Expected result: ('new', 'new')
Actual result: ('val1', 'new')

The presence of "global setting1" in a different function effectively
stops a shadowed setting1 from being created by the exec.

Workaround: Add a real assignment before the exec, i.e.:

def f(x):
    setting1 = 0
    exec(x)
    return setting1, setting2

or do the exec in a dictionary instead of in the current scope, i.e.:

def f(x):
    d ={"setting1":setting1,"setting2":setting2}
    exec(x) in d
    return d['setting1'], d['setting2']

Observed in:

Python 2.5.1 (r251:54863, May 18 2007, 16:56:43) on Cygwin
Python 2.5.2 on 2.6.26-gentoo-r1 (by Christopher Faylor
http://www.cygwin.com/ml/cygwin/2008-11/msg00168.html )

Not observed in:

Python 2.5.1 (r251:54863, Aug  1 2008, 00:32:16) on SUSE Linux
Python 2.4.4 (#2, Apr 17 2008, 01:58:28) (Debian etch, ARM)
Python 2.5.2 (r252:60911, Jul 31 2008, 17:31:22) (Ubuntu)

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue4315>
_______________________________________


More information about the Python-bugs-list mailing list