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>

1 番目はラップされfた 、2 番目は元fの です。16 進アドレスが異なることに注意してください。

元の にアクセスする必要がある場合は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 に答える