发送python修饰方法作为函数参数

时间:2012-07-11 11:01:01

标签: python decorator

我目前有以下使用python库的代码:

f = Foo(original_method, parameters)

我想扩充original_method,并让装饰器添加几行代码。让我们调用新的装饰方法decorated_method。最后我想有这样的事情:

f = Foo(decorated_method(original_method), parameters)

我的问题是:这可能吗?装饰者怎么样? 我必须说我不能扩展original_method,因为它是外部库的一部分。

编辑:original_method未执行,仅作为参数传递给Foo。 decorated_method函数应该做一些日志记录并收集一些调用的统计信息。

稍后编辑:以下示例中的代码运行正常。我有一些额外的问题,因为original_method有一些属性,所以这是最终的代码:

def decorated_method(method):

    def _reporter(*args, **kwargs):
        addmetric('apicall', method.__name__)
        return method(*args, **kwargs)

    _reporter.original_method_attribute = method.original_method_attribute
    return _reporter

2 个答案:

答案 0 :(得分:2)

你没有提到你想要decorated_method做什么,但这肯定是可能的:

def decorated_method(f):
    def _wrapped(*args, **kwargs):
        print "About to call f!"
        ret = f(*args, **kwargs)
        print "Just got finished with f, ret = %r" % (ret,)
        return ret
    return _wrapped

这只是标准的装饰器结构:装饰器是一个接受函数并返回函数的函数。

答案 1 :(得分:0)

绝对:

def decorated_method(fn):
    def inner_method(*args, **kwargs):
        print("before calling")
        result = fn(*args, **kwargs)
        print("after calling")
        return result
    return inner_method

一旦你有了这个工作,你应该看看signature-preserving decorators