functools.wraps有未修饰的参考吗?

时间:2012-07-25 21:04:54

标签: python

#!/usr/bin/python

from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print func.__name__ + " was called"
        return func(*args, **kwargs)
    return with_logging

@logged
def f(x):
   """does some math"""
   return x + x * x

我想知道wraps是否有对函数f的未修饰引用?当我尝试dir(f)

时,我没有看到它

修改版

#!/usr/bin/python

from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print func.__name__ + " was called"
        return func(*args, **kwargs)
    with_logging.undecorated = func
    return with_logging

@logged
def f(x):
   """does some math"""
   return x + x * x

f.undecorated

没有属性?我只是跟着我以前用装饰器做的事情......

2 个答案:

答案 0 :(得分:3)

那里有一个原始f的引用,但是它很麻烦。

>>> f
<function f at 0x023F6DF0>
>>> f.func_closure[0].cell_contents
<function f at 0x023F6E30>

第一个是包裹f,第二个是原始f,注意十六进制地址不同。

如果您需要访问原始f,我建议您换一种方式:

def f(x):
   """does some math"""
   return x + x * x
original_f = f
f = logged(f)

现在您有foriginal_f,两者都可以使用。

答案 1 :(得分:1)

您可以通过以下方式访问原始功能:

f.__wrapped__()

其中f是您正在装饰的功能