Skip to main content
 首页 » 编程设计

python之装饰器包装函数的导入路径

2025年05月04日13Leo_wl

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

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