假设我有一个装饰器和一个像这样的包装函数:
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),我只是不知道该怎么做。
请您参考如下方法:
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
