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-...@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
> sc...@scottdial.com
> scod...@cs.indiana.edu
>
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to