装饰器输出历史输入和输出的平均值以发挥作用

Decorator to output average of historical inputs and outputs to function

我有一些函数可以将一个整数作为输入并输出一个整数。我需要写一个装饰器来包装它们。

装饰器将保存一个包含两个数字的元组:输入的平均值和输出的平均值。每次调用那种函数,都会打印平均值。

我不太确定方法。我试过了,但它只是 returns 当前函数调用的相同输入和输出,我如何计算到目前为止所有输入和输出的平均值?或者我如何保留下一次调用装饰器的参数数量?

def dec(func):
    def wrap(*args):
        counter = len(args)
        avg_input = sum(args) / counter
        avg_output = func(*args)
        print("Average of inputs ", avg_input)
        print("Average of outputs ", avg_output)
    return wrap


@dec
def func(num):
    return num * 2


func(2) # now the avg_inputs = 2 and avg_outputs = 4
func(4) # now the avg_inputs = 3 and avg_outputs = 6
func(6) # now the avg_inputs = 4 and avg_outputs = 8

当前输出为:

Average of inputs  2.0
Average of outputs  4
Average of inputs  4.0
Average of outputs  8
Average of inputs  6.0
Average of outputs  12

而我实际需要的输出是:

Average of inputs  2.0
Average of outputs  4
Average of inputs  3.0
Average of outputs  6
Average of inputs  4.0
Average of outputs  8
from functools import wraps

def dec(func):
    @wraps(func)
    def wrap(*args):
        wrap.counter += 1
        wrap.sum_inputs += int(*args)
        wrap.sum_outputs += func(*args)
        avg_input = wrap.sum_inputs / wrap.counter
        avg_output = wrap.sum_outputs / wrap.counter
        print("Average of inputs ", avg_input)
        print("Average of outputs ", avg_output)
        return func(*args)
    wrap.counter = 0
    wrap.sum_inputs = 0
    wrap.sum_outputs = 0
    return wrap