装饰器包装函数的导入路径?

时间:2011-02-10 00:41:49

标签: python decorator

假设我有一个装饰器和这样的包装函数:

def squared(method):
    def wrapper(x, y):
        return method(x*x, y*y)
    return wrapper

@squared
def sum(x, y):
    return x+y

我还有其他想要调用sum函数未修饰版本的代码。是否有一个导入技巧可以让我这个解开的方法?如果我的代码说from some.module.path import sum那么,我得到了sum方法的包装版本,在这种情况下,这不是我想要的。 (是的,我知道我可以将其分解为辅助方法,但这会破坏我在这里所采用的模式的一些清洁度。)

我可以为装饰器添加额外的“魔法”以提供一些我可以导入的替代符号名称(如orig_sum),我只是不知道该怎么做。

2 个答案:

答案 0 :(得分:4)

def unwrap(fn):
    return fn.__wrapped__

def squared(method):
    def wrapper(x, y):
        return method(x*x, y*y)
    wrapper.__wrapped__ = method
    return wrapper

@squared
def sum(x, y):
    return x+y

sum(2,3)       ->  13
unwrap(sum)(2,3)  ->  5

答案 1 :(得分:3)

这个怎么样?

def squared(method):
    def wrapper(x, y):
        return method(x*x, y*y)
    return wrapper

def sum(x, y):
    return x+y

squared_sum = squared(sum)

它仍然是装饰者,但你仍然可以毫无魔法地导入squaredsum。不确定这是否是'helper方法'的意思,但我发现它比sum方法更清晰,它实际上是对输入的平方进行求和。