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

标签 python python-3.x django

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


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/

相关文章:

python - numpy.load 来自 io.BytesIO 流

python - 调试时在 pool.close() 上抛出异常,但在运行时不会抛出异常

python - 在 Python 3 中更改 Windows 10 背景

python - 在Python中的实例方法上调用多处理池

python - Django 完整性错误 : no default value

python - 将 Python/Flask 应用程序从 Heroku 迁移到 Azure 时出现 WSGI 错误

python-3.x - Elasticsearch批量插入无法完全正常工作

python - 更改用户电子邮件的 Django 方法不起作用

python - Django urls 直接到 html 模板

python - 如何在 Virtualenv 的解释器启动时执行 Python 代码?