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

Fra*_*ank 5 python django python-3.x

我正在创建一个小助手工具。它是一个计时器装饰器(不是很特别),用于测量任何方法的执行时间。

它在控制台上打印计算出的执行时间以及有用的信息。


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
Run Code Online (Sandbox Code Playgroud)

这给了我模型名和函数名:

user.models.get_matches(demo) -> 24.09ms.
Run Code Online (Sandbox Code Playgroud)

我也想在输出中包含类名:

user.models.User.get_matches(demo) -> 24.09ms.
Run Code Online (Sandbox Code Playgroud)

如何从包装器内部获取函数('func')的类名?


编辑:非常感谢李浩。这是完成的版本:

user.models.get_matches(demo) -> 24.09ms.
Run Code Online (Sandbox Code Playgroud)

Mad*_*Lee 5

如果您使用的是 Python 3

尝试使用func.__qualname__而不是func.__name__.

如果您使用的是 Python 2

尝试使用func.im_class.__name__来获取类的名称。

参考:PEP 3155

  • 完美解决,之前没见过这个属性。+1 (2认同)