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