首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Decorator -打印描述而不是名称

Python Decorator -打印描述而不是名称
EN

Stack Overflow用户
提问于 2019-05-29 03:27:43
回答 1查看 248关注 0票数 -2

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

代码语言:javascript
复制
 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():
EN

回答 1

Stack Overflow用户

发布于 2019-05-29 03:43:18

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

代码语言:javascript
复制
 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中,则需要为装饰器创建另一个接受参数的层:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
@timer('call service xyz')
def xyz():
    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56348890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档