[ python-Bugs-991196 ] An inconsistency with nested scopes
SourceForge.net
noreply at sourceforge.net
Wed Jul 14 23:30:24 CEST 2004
Bugs item #991196, was opened at 2004-07-14 16:30
Message generated for change (Tracker Item Submitted) made by Item Submitter
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=991196&group_id=5470
Category: Python Interpreter Core
Group: Python 2.3
Status: Open
Resolution: None
Priority: 5
Submitted By: Nick Jacobson (nickjacobson)
Assigned to: Nobody/Anonymous (nobody)
Summary: An inconsistency with nested scopes
Initial Comment:
There's an inconsistency with nested scopes.
>From the Python Ref. Manual:
"If [a local variable] definition occurs in a function block,
the scope extends to any blocks contained within the
defining one..."
i.e. So as long as code is not on the module level,
scopes are extended. Therefore this works:
def main():
y = 3
def execfunc():
print y
execfunc()
if __name__ == '__main__':
main()
In addition, if code IS on the module level, its variables
go in globals(). So this works too:
y = 3
def execfunc():
print y
execfunc()
However, (here's the inconsistency) the following code
fails, saying that y is undefined:
def main():
s = """
y = 3
def execfunc():
print y
execfunc()
"""
d = {}
e = {}
exec s in d, e
if __name__ == '__main__':
main()
In this case, the code in s is treated like it's on the
module level, and the nested scope treatment of y
doesn't occur. BUT, unlike normal code on the module
level, y doesn't go in globals(). I think globals() is
locked or something?
Conclusion:
The latter piece of code should work; that is, y should
be nested and therefore recognized by execfunc().
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=991196&group_id=5470
More information about the Python-bugs-list
mailing list