首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象多个函数调用的优雅方式?

抽象多个函数调用的优雅方式?
EN

Stack Overflow用户
提问于 2009-07-07 20:16:01
回答 2查看 220关注 0票数 1

示例:

代码语言:javascript
复制
>>> 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?也许在标准库的帮助下..而不需要重新发明轮子?

EN

回答 2

Stack Overflow用户

发布于 2009-07-07 20:19:58

像这样的东西?

代码语言:javascript
复制
def multicall(*functions):
    def call_functions(*args, **kwds):
        for function in functions:
            function(*args, **kwds)
    return call_functions

如果您想要聚合结果:

代码语言:javascript
复制
def multicall(*functions):
    def call_functions(*args, **kwds):
        return [function(*args, **kwds) for function in functions]
    return call_functions

编辑

建议使用装饰器;在这种情况下,它将如下所示:

代码语言:javascript
复制
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()接受在修饰函数之后调用的任意数量的函数。您可能希望以不同的方式实现装饰器,这取决于您想要的返回值--来自装饰性函数的原始返回值、所有函数结果的列表,或者根本不返回值。

票数 5
EN

Stack Overflow用户

发布于 2009-07-07 20:22:19

您可以研究一下Python装饰器。

这里有一个清晰的描述:http://www.artima.com/weblogs/viewpost.jsp?thread=240808

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1094611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档