getattr() on nested functions?

Gabriel Rossetti gabriel.rossetti at arimaz.com
Wed Aug 20 11:01:29 EDT 2008


Gabriel Genellina wrote:
> En Wed, 20 Aug 2008 05:34:38 -0300, Gabriel Rossetti 
> <gabriel.rossetti at arimaz.com> escribi�:
>
>> I can't get getattr() to return nested functions, I tried this :
>>
>>  >>> def toto():
>> ...     def titi():
>> ...             pass
>> ...     f = getattr(toto, "titi")
>> ...     print str(f)
>> ...
>>  >>> toto()
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>>   File "<stdin>", line 4, in toto
>> AttributeError: 'function' object has no attribute 'titi'
>>  >>>
>>
>> I thought that since functions are objects, that I could obtain it's 
>> nested functions. How come it doesn't work and what can I do to 
>> fix/replace it? I'm using it in code that is like this :
>
> Yes, functions are objects, but inner functions aren't attributes of 
> the outer; they live in its local namespace instead (and inner 
> functions won't exist until the outer function executes)
Ok, yes, I see
>
>> def __test(self, action, *args):
>>         def request(params):
>>             pass
>>                    def submit(params, values):
>>             pass
>>                    def update(params, values):
>>             pass
>>                    def delete(params):
>>             pass
>>                result = getattr(__test, action)(*args)
>>                return resultToXml(result)
>>
>> where "action" is a string containing either "request", "submit", 
>> "update", or "delete". I was using an evel() with this form :
>>
>> result = eval(action + "(params, values)")
>>
>> but I didn't find that very clean.
>
> Try using locals()[action]
Yes, that works, thanks, I keep on forgetting that locals() exists!



More information about the Python-list mailing list