装饰器输出历史输入和输出的平均值以发挥作用
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
我有一些函数可以将一个整数作为输入并输出一个整数。我需要写一个装饰器来包装它们。
装饰器将保存一个包含两个数字的元组:输入的平均值和输出的平均值。每次调用那种函数,都会打印平均值。
我不太确定方法。我试过了,但它只是 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