Question about "exec in globals, locals"

G

Giles Brown

I do not understand why the following code produces
NameError: name 'FirstClass' is not defined
when both a global and local dict are passed into exec, but
not when only a global dict is passed in.

I seek enlightenment!

Thanks,
Giles Brown

<python_code>

source = """
class FirstClass:
pass
class SecondClass:
References = [FirstClass]
"""

# Case - 1
myglobals = {'__builtins__' : None, '__name__': None}
exec source in myglobals

print "Global names are:", myglobals.keys()

# Case - 2
myglobals = {'__builtins__' : None, '__name__': None}
mylocals = {}

exec source in myglobals, mylocals

print "Global names are:", myglobals.keys()
print "Local names are:", mylocals.keys()

</python_code>
 
E

Egor Bolonev

Hello, Giles!
You wrote on 4 Jul 2003 01:41:36 -0700:

[Snipped]

GB> # Case - 2
GB> myglobals = {'__builtins__' : None, '__name__': None}
GB> mylocals = {}

GB> exec source in myglobals, mylocals
exec source in mylocals
exec source in myglobals
And it work with no errors. But I'm not sure you wish this.

GB> print "Global names are:", myglobals.keys()
GB> print "Local names are:", mylocals.keys()

With best regards, Egor Bolonev. E-mail: (e-mail address removed) [ru eo en]
 
A

Adrien Di Mascio

Hi,
source = """
class FirstClass:
pass
class SecondClass:
References = [FirstClass]
"""


When you specify both locals() and globals(), here's what happen :

"""
class FirstClass:
pass

## ---------> Here, your locals() dict have been updated, but not your
## globals() one.
## But, here, you can do : References = [FirstClass] since your
## locals()
## know about 'FirstClass'

class SecondClass:
## ---------> Here, your locals() dict is a new one since you've
just
## entered a new scope. So, 'FirstClass' is neither defined in
## 'locals()' nor in 'globals()', that's why you have your
NameError
"""

I'm not quite sure of my explanation, but that could explain your
problem. Sorry if I've made any Python mistake.

Cheers,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top