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] = funcIf 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] = functhough 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
_______________________________________________ Tutor maillist - [email protected] http://mail.python.org/mailman/listinfo/tutor
