gpt4 book ai didi

带有输出类名的python计时器装饰器

转载 作者:行者123 更新时间:2023-12-03 16:21:00 25 4
gpt4 key购买 nike

我正在创建一个小助手工具。
它是一个计时器装饰器(不是很特别),用于测量任何方法的执行时间。
它在控制台上打印计算出的执行时间以及有用的信息。


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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com