Python-list Digest, Vol 76, Issue 97

Mitchell L Model MLMDev at Comcast.net
Sat Jan 9 17:43:34 EST 2010


On Jan 8, 2010, at 7:35:39 PM EST, Terry Reedy <tjreedy at udel.edu> wrote:
>
> On 1/8/2010 12:02 PM, Mitchell L Model wrote:
>
>
>> On further reflection, I will add that
>> what appears to be happening is that during import both the global  
>> and
>> local dictionaries are set to a copy of the globals() from the  
>> importing
>> scope and that copy becomes the value of the module's __dict__ once
>> import has completed successfully.
>
> I have no idea why you think that. The module dict starts empty  
> except for __name__, __file__, and perhaps a couple of other  
> 'hidden' items. It is not a copy and has nothing to do with  
> importing scopes.

Why I think -- or, rather, thought -- that was because of some  
defective experiments I ran. It was purely a delusion. Thank you for  
correcting it.

>
> > and that copy becomes the value of the module's __dict__ once
> > import has completed successfully.
>
> That new dict becomes .... .
>
>> Because exec leaves locals() and globals() distinct,
>
> Not necessarily.
>
> In 3.x, at least,
> exec(s)
> executes s in the current scope. If this is top level, where locals  
> is globals, then same should be true within exec.

Yes. To simplify some of my ramblings and incorporate the points you  
and others have made, and to once again acknowledge Python's elegance,  
an important observation which I bet even a lot of serious Python  
programs don't realize (or at least not consciously) is that:
	globals() is locals()
in the following contexts:
	the interpreter top level
	the top level of a module (though as you point out, starts out as a  
very bare dictionary during import)
	a string being exec'd when the call to exec includes
		no dictionary argument(s)
		one dictionary argument
		the same dictionary as both the second and third arguments
The identity does not hold for:
	a string being exec'd when a different dictionary is provided as the  
second and third arguments to exec
	inside anything that creates a scope: a function definition, class  
definition, etc.

Did I get all that right? Are there any other contexts that should be  
included in these?

>
> d = {}
> exec(s, d)
>
> In 3.x, at least, d will also be used as locals.

Yes, talking about 3.x.

>
> exec(s, d, d)
>
> Again, globals and locals are not distinct.
>
> It would seem that in 3.x, the only way for exec to have distinct  
> globals and locals is to call exec(s) where they are distinct or to  
> pass distince globals and locals.

Apparently so. To clarify "where they are distinct", that would mean  
from a context in which they were already distinct, which is not the  
case if exec is called from the top level, but is the case if called  
from within, say, a function, as my code does.


>
> Some of the issues of this thread are discussed in Language  
> Reference 4.1, Naming and Binding. I suppose it could be clearer  
> that it is, but the addition of nonlocal scope complicated things.


I pretty much have that section memorized and reread it at least  
monthly. It's part of what I meant by starting my original comments by  
saying that I thought I understood all of this. Thank you (and others)  
for helping clarify exactly what's going on. As with so many things in  
Python, it is not always easy to keep one's preconceptions, delusions,  
and experiences with other languages out of the way of its simplicity,  
even if one is a very experienced and knowledgeable Python programmer.

	--- Mitchell
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20100109/b898fc46/attachment.html>


More information about the Python-list mailing list