首页 > 解决方案 > Python Decorator - 打印描述而不是名称

问题描述

我有以下用于打印响应时间的装饰器功能。用这个装饰器装饰另一个函数时,有没有办法传递装饰器的描述?例如:我想打印“调用服务 xyz”而不是函数名“call_service_xyz”

 def timer(func):
        """Print the runtime of the decorated function"""
        @functools.wraps(func)
        def wrapper_timer(*args, **kwargs):
            start_time = time.perf_counter()    # 1
            value = func(*args, **kwargs)
            end_time = time.perf_counter()      # 2
            run_time = end_time - start_time    # 3
            logger.info(f"Finished {func.__name__!r} in {run_time:.4f} secs")
            return value
        return wrapper_timer

@timer("call service xyz")
def call_service_xyz():

标签: pythonpython-3.x

解决方案


您可以打印文档字符串作为函数的描述:

 def timer(func):
    """Print the runtime of the decorated function"""
    @functools.wraps(func)
    def wrapper_timer(*args, **kwargs):
        start_time = time.perf_counter()    # 1
        value = func(*args, **kwargs)
        end_time = time.perf_counter()      # 2
        run_time = end_time - start_time    # 3
        logger.info(f"{desc} Finished in {run_time:.4f} secs")
        return value
    return wrapper_timer

@timer
def call_service_xyz():
    """Call service xyz."""
    # ^^ this is the docstring which is
    # assigned to .__doc__

或者,如果您希望将描述传递给timer您需要为接受参数的装饰器创建另一个层:

def timer(desc):
    def decorator(func):
        @functools.wraps(func)
        def wrapper_timer(*args, **kw):
            start_time = time.perf_counter()
            value = func(*args, **kw)
            end_time = time.perf_counter()
            run_time = end_time - start_time
            logger.info(f"{func.__doc__!r} Finished in {run_time:.4f} secs")
            return value
        return wrapper_timer
    return decorator

现在按照您在问题中的描述使用:

@timer('call service xyz')
def xyz():
    ...

推荐阅读