homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: 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
Type: behavior Stage:
Components: None Versions: Python 2.5
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: amaury.forgeotdarc, ggenellina, jhylton, ssb22
Priority: normal Keywords:

Created on 2008年11月13日 16:06 by ssb22, last changed 2022年04月11日 14:56 by admin. This issue is now closed.

Messages (3)
msg75829 - (view) Author: Silas S. Brown (ssb22) Date: 2008年11月13日 16:06
Here's the example code:
setting1 = "val1"
setting2 = "val2"
def dummy():
 global setting1
def f(x):
 d ={"setting1":setting1,"setting2":setting2}
 exec(x) in d
 return d['setting1'], d['setting2']
print f("setting1=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.
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)
msg75831 - (view) Author: Silas S. Brown (ssb22) Date: 2008年11月13日 16:10
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)
msg84781 - (view) Author: Jeremy Hylton (jhylton) (Python triager) Date: 2009年03月31日 13:49
Committed revision 70809 (trunk). Needs to be backported.
History
Date User Action Args
2022年04月11日 14:56:41adminsetgithub: 48565
2009年03月31日 13:49:07jhyltonsetstatus: open -> closed

nosy: + jhylton
messages: + msg84781

resolution: fixed
2008年11月27日 20:11:33ggenellinasetnosy: + ggenellina
2008年11月13日 18:00:51amaury.forgeotdarcsetnosy: + amaury.forgeotdarc
2008年11月13日 16:10:27ssb22setmessages: + msg75831
2008年11月13日 16:06:12ssb22create

AltStyle によって変換されたページ (->オリジナル) /