#!/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
没有属性?我只是跟着我以前用装饰器做的事情......
答案 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)
现在您有f
和original_f
,两者都可以使用。
答案 1 :(得分:1)
您可以通过以下方式访问原始功能:
f.__wrapped__()
其中f是您正在装饰的功能