getattr() on nested functions?

Gabriel Rossetti gabriel.rossetti at arimaz.com
Thu Aug 21 09:58:19 EDT 2008


Bruno Desthuilliers wrote:
> Gabriel Rossetti a écrit :
>> Terry Reedy wrote:
> (snip)
>>> Unlike the class approach, this requires recreating the constant 
>>> functions and dict with each call to _test.  Quick to write but a 
>>> bit 'dirty', in my opinion.  Another standard idiom is to set up the 
>>> constants outside the function:
>>>
>>> def request(params):
>>>     pass
>>> def submit(params, values):
>>>     pass
>>> def update(params, values):
>>>     pass
>>> def delete(params):
>>>     pass
>>> dispatch = {'request':request, 'submit':submit, 'update':update, 
>>> 'delete':delete}
>>>
>>> def _test(self, action, *args):
>>>     return resultToXmo(dispatch[action](*args))
>>
>> That's how I had done it originally (before the use of eval()), but 
>> in this case also, since the functions are still nested, 
>
> Uh ??? You probably want to re-read the above code snippet.
>
Uh...yes, I didn't see the external/parent function was no longer there. 
I prefer to nest mine though because I have several parent functions for 
different tasks, so each child/nested function has a diff. 
implementation, I find that cleaner than having n*4+n top-level 
functions (+ n dicts), e.g. I prefer this :

    def __task1(self, action, *args):
        def request(params):
            pass
        def submit(params, values):
            pass
        def update(params, values):
            pass
        def delete(params):
            pass
        return resultToXml(locals()[action](*args))

    def __task2(self, action, *args):
        def request(params):
            pass
        def submit(params, values):
            pass
        def update(params, values):
            pass
        def delete(params):
            pass
        return resultToXml(locals()[action](*args))


over this :

    def task1_request(params):
        pass
    def task1_submit(params, values):
        pass
    def task1_update(params, values):
        pass
    def task1_delete(params):
        pass
       
    def task2_request(params):
        pass
    def task2_submit(params, values):
        pass
    def task2_update(params, values):
        pass
    def task2_delete(params):
        pass

    dispatch_task1 = {'request':task1_request, 'submit':task1_submit,
    'update':task1_update, 'delete':task1_delete}
    dispatch_task2 = {'request':task2_request, 'submit':task2_submit,
    'update':task2_update, 'delete':task2_delete}

    def _task1(self, action, *args):
        return resultToXml(dispatch_task1[action](*args))
       
    def _task2(self, action, *args):
        return resultToXml(dispatch_task2[action](*args))


I could use your callable approach, but like you said it may not be 
worth the trouble.

Gabriel




More information about the Python-list mailing list