[Python-Dev] Inconsistent nesting of scopes in exec(..., locals())
Joachim B Haga
jobh at broadpark.no
Fri Apr 23 21:53:51 CEST 2010
Nick Coghlan <ncoghlan at gmail.com> writes:
> Joachim B Haga wrote:
>> There seem to be an inconsistency in the handling of local scopes in
>> exec. [...]
>>
>> The intermediate scope is searched for the variable name if the third
>> argument to exec() is locals(), but not if it is locals().copy().
>
> What actually matters is whether or not the first and second scope are
> the same dictionary or not.
>
> If they're different, then the supplied local scope is treated as
> equivalent to a class definition scope, and hence won't participate in
> lexical scoping. If they're the same (which happens implicitly if the
> second one is omitted) then they're treated as a module scope (and hence
> written values are visible as globals inside any defined functions).
Ok, thank you for the explanation.
> Since changing this would break class definitions, that ain't going to
> happen. Suggestions for how to explain the behaviour more clearly in the
> exec() documentation probably wouldn't hurt though.
I don't quite see how exec() affects the class definition syntax?
Anyhow, I definitely agree that this should be documented. I
suggest the following (condensed from your explanation):
-If provided, /locals/ can be any mapping object.
+If provided, /locals/ can be any mapping object. It is treated as
equivalent to a class definition scope, and hence does not participate
in lexical scoping.
--
Joachim B Haga
More information about the Python-Dev
mailing list