[Python-Dev] variable name resolution in exec is incorrect
Colin H
hawkett at gmail.com
Thu May 27 15:39:28 CEST 2010
Yep fair call - was primarily modifying Guido's example to make the
point about not being able to delete from the globals returned from
exec - cheers,
Colin
On Thu, May 27, 2010 at 2:09 PM, Scott Dial
<scott+python-dev at scottdial.com> wrote:
> On 5/27/2010 7:14 AM, Colin H wrote:
>> def define_stuff(user_code):
>> context = {...}
>> stuff = {}
>> stuff.update(context)
>>
>> exec(user_code, stuff)
>>
>> return_stuff = {}
>> return_stuff.update(stuff)
>>
>> del return_stuff['__builtins__']
>> for key in context:
>> if key in return_stuff and return_stuff[key] == context[key]:
>> del return_stuff[key]
>>
>> return return_stuff
>
> I'm not sure your application, but I suspect you would benefit from
> using an identity check instead of an __eq__ check. The equality check
> may be expensive (e.g., a large dictionary), and I don't think it
> actually is checking what you want -- if the user_code generates an
> __eq__-similar dictionary, wouldn't you still want that? The only reason
> I can see to use __eq__ is if you are trying to detect user_code
> modifying an object passed in, which is something that wouldn't be
> addressed by your original complaint about exec (as in, modifying a
> global data structure).
>
> Instead of:
>> if key in return_stuff and return_stuff[key] == context[key]:
>
> Use:
>> if key in return_stuff and return_stuff[key] is context[key]:
>
> --
> Scott Dial
> scott at scottdial.com
> scodial at cs.indiana.edu
>
More information about the Python-Dev
mailing list