关键点
装饰器是一个函数。它的输入是一个函数I,输出也是一个函数O, 函数I表示需要被装饰的函数,函数O表示最后被实际调用的函数
- 第一种装饰器:@wraps
def actual_decorator(predict):
def new_predict(
inputs,
output_ids,
states,
temperature=1,
rtype='logits'
):
prediction = predict(inputs, output_ids, states)
print('temperature:', temperature)
print('rtype:', rtype)
return prediction
return new_predict
@actual_decorator
def predict(inputs, output_ids, states):
return inputs * output_ids + states
if __name__ == '__main__':
print(predict(1, 2, 3, 10, 'xx')) # 此时的参数是函数O的参数形式
- 第二种装饰方式:@wraps()
此处可以理解为,wraps()返回actual_decorator,所以,@wraps()等效于@actual_decorator。此处的实际装饰器是actual_decorator
def wraps(default_rtype='probas', random=None):
def actual_decorator(predict):
def new_predict(
inputs,
output_ids,
states,
temperature=1,
rtype=default_rtype
):
prediction = predict(inputs, output_ids, states)
print('temperature', temperature)
print('rtype', rtype)
return prediction
return new_predict
return actual_decorator
@wraps(default_rtype='logits')
def predict(inputs, output_ids, states):
return inputs * output_ids + states
if __name__ == '__main__':
print(predict(1, 2, 3, 10, 'xx'))
#temperature: 10
#rtype: xx
#5