python - 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():
解决方案
您可以打印文档字符串作为函数的描述:
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():
...
推荐阅读
- python - 如何创建具有未知数量实例的类?
- css - 将鼠标悬停在表格标题-CSS上时如何更改文本的颜色
- flutter - 清除手机内部应用数据
- flutter - 不接受某些 Android 许可证。要解决此问题,请运行:flutter doctor --android-licenses
- ruby-on-rails - 我用 Ruby 做了一个游戏,我如何让它在互联网上可以玩?[Ruby]
- google-api - Google Docs Api v2 Invalid grant error with Malformed Auth Code description
- javascript - jQuery,单击时将对象从数组传递到另一个函数
- maven - 无法确定 http://download.java.net/maven/2 中是否存在资源 XXXX
- wordpress - 将 ci 和 wp 放在服务器根目录中
- node.js - 使用 Observables 包装套接字时出现问题 - MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏