Python 装饰器:计算函数调用次数

问题描述 投票:0回答:1

我想创建计算函数调用的装饰器。
我很接近,但问题是输出是每个函数的单独字典,我希望每个函数都存储在一个字典中。
如何制作可以存储此类数据的全局字典,我尝试添加另一个创建字典的装饰器但它没有帮助,非局部变量也没有帮助?

def count(func):
    def inner():
        inner.calls += 1
        if inner.calls > 1:
            count_update = inner.dict[func.__name__] + 1
            update = {func.__name__:count_update}
            inner.dict.update(update)         
        else:     
            inner.dict={func.__name__:1}
        func()
        print(f'Current state {inner.dict}')           
    inner.calls = 0
    inner.dict={}
    return inner

@count
def show_date():
    current_time = datetime.now()
    current_time_formatted = current_time.strftime("%Y-%d-%B-%A")
    print(current_time_formatted)   
    return current_time_formatted

@count
def print_random_number2():
    numb = random.randint(0,10000)
    string_final=f'Number is {numb}'
    print(string_final)
    return string_final

show_date()
show_date()
show_date()
print_random_number2()
print_random_number2()
show_date()
python function variables decorator
1个回答
1
投票

您可以通过在全局范围内(即函数外部)创建字典来声明全局字典:

func_counts = {}
def count(func):
    def inner():
        func_counts[func.__name__] = func_counts.get(func.__name__, 0) + 1
        func()
        print(f'Current state {func_counts}')
    return inner

没有必要用

global
nonlocal
声明它,因为你没有在函数内部重新绑定它。

© www.soinside.com 2019 - 2024. All rights reserved.