我有一个测量执行时间的装饰器,我想打印函数名称和时间。这通常很容易,因为我可以使用function.__name__
。棘手的部分是当我附加另一个装饰器时,它采用以下格式。
def retry_until(desired_return_value, retries=0):
def decorator(f):
def wrapper(*args, **kwargs):
在这种情况下,我在包装函数中打印f.__name__
,我为f.__name__
获取的值是wrapper()。我想将值作为装饰的函数名称。有没有办法做到这一点?
示例:
def get_execution_time(f):
def wrapper(*args, **kwargs):
start_time = time.time()
ret = f(*args, **kwargs)
print(f.__name__ + "() completed in %s seconds" % (time.time() - start_time))
return ret
return wrapper
@get_execution_time
def test(): # Function name is "test"
pass
@get_execution_time
@retry_until(False, 2)
def test(): # Function name is "wrapper", the inner-most function in retry_until
pass
答案 0 :(得分:4)
您可以手动重新分配__name__
,或者您可以使用functools.wraps
为您做一些相关的事情:
import functools
def retry_until(desired_return_value, retries=0):
def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
...