我正在创建一个小助手工具。
它是一个计时器装饰器(不是很特别),用于测量任何方法的执行时间。
它在控制台上打印计算出的执行时间以及有用的信息。
def timer(func):
"""@timer decorator"""
from functools import wraps
from time import time
def concat_args(*args, **kwargs):
for arg in args:
yield str(arg)
for key, value in kwargs.items():
yield str(key) + '=' + str(value)
@wraps(func) # sets return meta to func meta
def wrapper(*args, **kwargs):
start = time()
ret = func(*args, **kwargs)
dur = format((time() - start) * 1000, ".2f")
print('{}{}({}) -> {}ms.'.format(
func.__module__ + '.' if func.__module__ else '',
func.__name__,
', '.join(concat_args(*args, **kwargs)),
dur
))
return ret
return wrapper
这给了我模型名和函数名:user.models.get_matches(demo) -> 24.09ms.
我也想在输出中包含类名:user.models.User.get_matches(demo) -> 24.09ms.
如何从包装器内部获取函数('func')的类名?编辑:非常感谢李浩。
这是完成的版本:
def timer(func):
"""@timer decorator"""
from functools import wraps
from time import time
def concat_args(*args, **kwargs):
for arg in args:
yield str(arg)
for key, value in kwargs.items():
yield str(key) + '=' + str(value)
@wraps(func) # sets return meta to func meta
def wrapper(*args, **kwargs):
start = time()
ret = func(*args, **kwargs)
dur = format((time() - start) * 1000, ".2f")
print('{}{}({}) -> {}ms.'.format(
func.__module__ + '.' if func.__module__ else '',
func.__qualname__,
', '.join(concat_args(*args, **kwargs)),
dur,
))
return ret
return wrapper
最佳答案
如果您使用的是 Python 3
尝试使用 func.__qualname__
而不是 func.__name__
.
如果您使用的是 Python 2
尝试使用 func.im_class.__name__
获取类名。
引用:PEP 3155
关于带有输出类名的python计时器装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62504422/