[Python-Dev] variable name resolution in exec is incorrect

Colin H hawkett at gmail.com
Thu May 27 03:13:42 CEST 2010


Of course :) - I need to pay more attention. Your workaround should do
the trick. It would make sense if locals could be used for this
purpose, but the workaround doesn't add so much overhead in most
situations.  Thanks for the help, much appreciated,

Colin

On Thu, May 27, 2010 at 2:05 AM, Guido van Rossum <guido at python.org> wrote:
> On Wed, May 26, 2010 at 5:53 PM, Colin H <hawkett at gmail.com> wrote:
>>   Thanks for the possible workaround - unfortunately 'stuff' will
>> contain a whole stack of things that are not in 'context', and were
>> not defined in 'user_code' - things that python embeds - a (very
>> small) selection -
>>
>> {..., 'NameError': <type 'exceptions.NameError'>, 'BytesWarning':
>> <type 'exceptions.BytesWarning'>, 'dict': <type 'dict'>, 'input':
>> <function input at 0x10047a9b0>, 'oct': <built-in function oct>,
>> 'bin': <built-in function bin>, ...}
>>
>> It makes sense why this happens of course, but upon return, the
>> globals dict is very large, and finding the stuff you defined in your
>> user_code amongst it is a very difficult task.  Avoiding this problem
>> is the 'locals' use-case for me.  Cheers,
>
> No, if taken literally that doesn't make sense. Those are builtins. I
> think you are mistaken that each of those (e.g. NameError) is in stuff
> -- they are in stuff['__builtins__'] which represents the built-in
> namespace. You should remove that key from stuff as well.
>
> --Guido
>
>> Colin
>>
>> On Thu, May 27, 2010 at 1:38 AM, Guido van Rossum <guido at python.org> wrote:
>>> This is not easy to fix. The best short-term work-around is probably a
>>> hack like this:
>>>
>>> def define_stuff(user_code):
>>>  context = {...}
>>>  stuff = {}
>>>  stuff.update(context)
>>>  exec(user_code, stuff)
>>>  for key in context:
>>>    if key in stuff and stuff[key] == context[key]:
>>>      del stuff[key]
>>>  return stuff
>>>
>>> --
>>> --Guido van Rossum (python.org/~guido)
>>>
>>
>
>
>
> --
> --Guido van Rossum (python.org/~guido)
>


More information about the Python-Dev mailing list