1

関数がデコレータを介してルーティングされるたびにカウンターを増やしたいデコレータがあります。これまでのところ、これは私のコードです

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 にリセットされるまで、正常に動作します。合計回数を集計するにはどうすればよいですか?

4

2 に答える 2

1

これはそれを行う必要があります:

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)
于 2015-05-21T19:39:58.747 に答える