示例:
>>> def write_to_terminal(fmt, *args):
... print fmt % args
>>> LOG = logging.getLogger(__name__)
>>> info = multicall(write_to_terminal, LOG.info)
>>> debug = multicall(write_debug_to_terminal, LOG.debug)
>>> ...
>>> info('Hello %s', 'guido') # display in terminal *and* log the message有没有一种优雅的方式来编写multicall?也许在标准库的帮助下..而不需要重新发明轮子?
发布于 2009-07-07 20:19:58
像这样的东西?
def multicall(*functions):
def call_functions(*args, **kwds):
for function in functions:
function(*args, **kwds)
return call_functions如果您想要聚合结果:
def multicall(*functions):
def call_functions(*args, **kwds):
return [function(*args, **kwds) for function in functions]
return call_functions编辑
建议使用装饰器;在这种情况下,它将如下所示:
def appendcalls(*functions):
def decorator(decorated_function):
all_functions = [decorated_function] + list(functions)
def call_functions(*args, **kwds):
for function in all_functions:
function(*args, **kwds)
return call_functions
return decorator
LOG = logging.getLogger(__name__)
@appendcalls(LOG.info)
def info(fmt, *args):
print fmt % args
info('Hello %s', 'guido')appendcalls()接受在修饰函数之后调用的任意数量的函数。您可能希望以不同的方式实现装饰器,这取决于您想要的返回值--来自装饰性函数的原始返回值、所有函数结果的列表,或者根本不返回值。
发布于 2009-07-07 20:22:19
您可以研究一下Python装饰器。
这里有一个清晰的描述:http://www.artima.com/weblogs/viewpost.jsp?thread=240808
https://stackoverflow.com/questions/1094611
复制相似问题