[Tutor] How to put my functions in an array
Jeff Shannon
jeff at ccvcorp.com
Wed Dec 29 20:37:14 CET 2004
Mohamed Lrhazi wrote:
> def addvirt():
> pass
> def remvirt():
> pass
>
> PROVISION_ACTIONS=[('addvirt','Add Virt'),('remvirt','Remove Virt'),]
> formhandlers={}
>
> # this works
> formhandlers["addvirt"]=addvirt
> formhandlers["remvirt"]=remvirt
>
> # this does not work:
> for verb,verb_desc in PROVISION_ACTIONS:
> if callable(verb):
> formhandlers[verb]=verb
>
> I tried a few different syntaxes but to no avail... do I need things
> like: getattr()?
You don't say how this fails, which would be very helpful to know.
But I think I can guess what's happening.
When you're calling 'callable(verb)', at this point verb contains a
string which is a function's name. It is *not* the function itself.
The string is, of course, not callable, so nothing gets added to
formhandlers.
Even if you took out that test, though, you'd end up with a dictionary
where for a given key, the value is the same string that was used
for the key, because verb is only a string.
For this to work, you need to have two separate things -- a string by
which to identify the function, and a reference to the function object
itself. In the working code, you do this. By putting the name (that
you're using as the dictionary key) in quotes, you're specifying a
string, and by *not* putting the value (on the right of the = sign) in
quotes, you're referring to the function object.
There's a couple of ways you can do this. One is by adding a
reference to the function to your list, something like this:
PROVISION_ACTIONS = [('addvirt', "Add Virt", addvirt), ...]
for verb, verb_desc, func in PROVISION_ACTIONS:
if callable(func):
formhandlers[verb] = func
If you can't make that change to PROVISION_ACTIONS, then you may be
able to use the name strings to pull function references from your
module's global dictionary --
for verb, verb_desc in PROVISION_ACTIONS:
func = globals()[verb]
if callable(func):
formhandlers[verb] = func
though you'd probably want to put that globals() lookup in a
try/except block to catch any KeyErrors.
Note that if the functions were in a different module, you could
retrieve them from that module with getattr(), rather than using the
globals() dict.
import func_module
# ...
for ...
func = getattr(func_module, verb)
# ...
Once again, you should probably wrap that in a try/except block (this
time looking for AttributeErrors).
Jeff Shannon
Technician/Programmer
Credit International
More information about the Tutor
mailing list