exec src in {}, {} strangeness

Stefan Seefeld seefeld at sympatico.ca
Mon Mar 21 19:03:07 CET 2005

Bernhard Herzog wrote:
> Stefan Seefeld <seefeld at sympatico.ca> writes:
>>Is there anything wrong with 'exec source in a, b' where
>>a and b are distinc originally empty dictionaries ? Again,
>>my test code was
>>class Foo: pass
>>class Bar:
>>   foo = Foo
>>and it appears as if 'Foo' was added to 'a', but when evaluating
>>'foo = Foo' the interpreter only looked in 'b', not 'a'.
> No, it's the other way round.  Foo is added in b since bindings are done
> in the local scope.  Your case is a bit more complicated, though.
> Here's what I think happens:
> class Foo is bound in b, the locals dictionary, so there is no reference
> to Foo in the globals dictionary.  The body of class B is executed with
> it's own new locals dictionary.  That locals dictionary will effectively
> be turned into Bar.__dict__ when the class object is created.
> When "foo = Foo" is executed, Foo is first looked up in that new locals
> dictionary.  That fails, so it's also looked up in the globals
> dictionary a.  That fails as well because Foo was bound in b.  The final
> lookup in the builtins also fails, and thus you get an exception.

Thanks for the explanation ! I'm still unable to make a conclusion:
What is wrong ? Am I doing something stupid (I did try various things
such as inserting __builtin__ into the dictionary, etc.) ?
Or is that really a bug ?


More information about the Python-list mailing list