Aquí hay una versión más generalizada que utiliza decoradores de Python. Puede llamar por nombre corto o largo. Lo encontré útil al implementar CLI con subcomandos cortos y largos.
Los decoradores de Python son maravillosos. Bruce Eckel (Thinking in Java) describe aquí a los decoradores de Python.
http://www.artima.com/weblogs/viewpost.jsp?thread=240808 http://www.artima.com/weblogs/viewpost.jsp?thread=240845
#!/usr/bin/env python2
from functools import wraps
class CommandInfo(object):
cmds = []
def __init__(self, shortname, longname, func):
self.shortname = shortname
self.longname = longname
self.func = func
class CommandDispatch(object):
def __init__(self, shortname, longname):
self.shortname = shortname
self.longname = longname
def __call__(self, func):
print("hello from CommandDispatch's __call__")
@wraps(func)
def wrapped_func(wself, *args, **kwargs):
print('hello from wrapped_func, args:{0}, kwargs: {1}'.format(args, kwargs))
func(wself, *args, **kwargs)
ci = CommandInfo
ci.cmds += [ci(shortname=self.shortname, longname=self.longname, func=func)]
return wrapped_func
@staticmethod
def func(name):
print('hello from CommandDispatch.func')
for ci in CommandInfo.cmds:
if ci.shortname == name or ci.longname == name:
return ci.func
raise RuntimeError('unknown command')
@CommandDispatch(shortname='co', longname='commit')
def commit(msg):
print('commit msg: {}'.format(msg))
commit('sample commit msg') # Normal call by function name
cd = CommandDispatch
short_f = cd.func(name='co') # Call by shortname
short_f('short sample commit msg')
long_f = cd.func(name='commit') # Call by longname
long_f('long sample commit msg')
class A(object):
@CommandDispatch(shortname='Aa', longname='classAmethoda')
def a(self, msg):
print('A.a called, msg: {}'.format(msg))
a = A()
short_fA = cd.func(name='Aa')
short_fA(a, 'short A.a msg')
long_fA = cd.func(name='classAmethoda')
long_fA(a, 'short A.a msg')
Aunque son similares, esto no es un duplicado exacto de [esta cuestión] (http://stackoverflow.com/questions/3061/calling-a-function-from -a-string-with-the-functions-name-in-python), que pregunta acerca de una función en un módulo, en lugar de un método de un objeto. – Grumdrig