计算函数通过装饰器的次数



我有一个装饰器,我想增加一个计数器,每当一个函数通过装饰器路由。到目前为止这是我的代码

from functools import wraps
def count_check(function):
    """Returns number of times any function with this decorator is called
    """
    count = []
    @wraps(function)
    def increase_count(*args, **kwargs):
        count.append(1)
        return function(*args, **kwargs), len(count)
    return increase_count

它可以正常工作,直到另一个函数通过装饰器,并且该函数的计数重置为0。我如何把总次数加起来?

应该这样做:

from functools import wraps
def count_check(function, count=[0]):
    """Returns number of times any function with this decorator is called
    """
    @wraps(function)
    def increase_count(*args, **kwargs):
        count[0] += 1
        return function(*args, **kwargs), count[0]
    return increase_count

你也可以更花哨一点,使用字典分别计数函数,也可以分别计数:

from functools import wraps
def count_check(function, count={}):
    """Returns number of times any function with this decorator is called
    """
    count[function] = 0
    @wraps(function)
    def increase_count(*args, **kwargs):
        count[function] += 1
        return function(*args, **kwargs), count[function], sum(count.values())
    return increase_count
演示:

@count_check
def foo():
    return 42
print(foo(), foo(), foo())
@count_check
def bar():
    return 23
print(bar(), bar(), bar())
print(foo(), foo(), foo())

打印:

(42, 1, 1) (42, 2, 2) (42, 3, 3)
(23, 1, 4) (23, 2, 5) (23, 3, 6)
(42, 4, 7) (42, 5, 8) (42, 6, 9)

我会尝试这样做:

from functools import wraps
count = 0
def count_check(function):
    @wraps(function)
    def increase_count(*args, **kwargs):
        global count
        count += 1
        return function(*args, **kwargs), count
    return increase_count

相关内容

  • 没有找到相关文章

最新更新