[Tutor] getattr of functions
Kent Johnson
kent37 at tds.net
Thu Nov 24 14:27:18 CET 2005
Negroup - wrote:
> Hi all! I'm here again with a question about introspection.
>
> My module stores a set of functions. I need to know, from another
> script, if a particular function of this module "is enabled" (it
> means, if it shall be executed by the caller script). I looked for
> some introspective builtin/function, but I didn't find anything useful
> (except func_globals, func_dict, func_code, etc, that don't help in my
> case).
>
> This is my solution:
>
> mymodule.py
> def f1():
> pass
> def f2():
> pass
>
> setattr(f1, 'enabled', True)
> setattr(f2, 'enabled', False)
This seems OK to me. You don't need setattr(), you can set the attribute directly:
f1.enabled = True
Adding attributes to functions is only supported in recent versions of Python so this is not a good solution if you need to work with older versions.
>From your later description I see that you want to do this dynamically and the set of enabled functions is really a property of the client, not of the function itself. You have a list of headers and you want to apply all the functions that match the headers. I would look for a way to have the client figure out which functions to apply. Maybe keep a list of the headers and use it to filter the list of functions.
For example if fns is the list of functions and headers is a list (or set) of header names matching the functions you could do
for fn in fns:
if fn.__name__ in headers:
fn()
This keeps the responsibility for executing the correct functions with the client which seems like the right place to me.
Also if it matters, your solution is not thread-safe because it uses global state (the enabled flag in the function). If you have multiple threads doing this you will get errors.
Kent
--
http://www.kentsjohnson.com
More information about the Tutor
mailing list