Python:返回函数内函数内的函数名称

时间:2016-04-10 02:32:09

标签: python python-3.x

我有一个测量执行时间的装饰器,我想打印函数名称和时间。这通常很容易,因为我可以使用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

1 个答案:

答案 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):
            ...