3
#!/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

没有属性?我只是在遵循我过去对装饰者所做的事情......

4

2 回答 2

4

那里有对原件的引用f,但很难找到。

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

第一个是 Wrapped f,第二个是 original f,注意十六进制地址不同。

如果您需要访问原始文件f,我建议您以不同的方式包装它:

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

现在你有了foriginal_f,都可以使用了。

于 2012-07-25T21:11:07.583 回答
2

您可以通过调用来访问原始函数:

f.__wrapped__()

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

于 2015-06-22T20:24:20.097 回答