假设我有一个装饰器和这样的包装函数:
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
),我只是不知道该怎么做。
答案 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)
它仍然是装饰者,但你仍然可以毫无魔法地导入squared
和sum
。不确定这是否是'helper方法'的意思,但我发现它比sum
方法更清晰,它实际上是对输入的平方进行求和。