"lambda *args: None"在 Python 中用于什么


from tqdm import tqdm
class Engine(object):
def __init__(self):
hook_names = ['on_start', 'on_start_epoch', 'on_sample', 'on_forward',
'on_backward', 'on_end_epoch', 'on_update', 'on_end']
self.hooks = { }
for hook_name in hook_names:
self.hooks[hook_name] = lambda state: None # The definition place
def train(self, **kwargs):
state = {
'model': kwargs['model'],
'loader': kwargs['loader'],
'optim_method': kwargs['optim_method'],
'optim_config': kwargs['optim_config'],
'max_epoch': kwargs['max_epoch'],
'epoch': 0, # epochs done so far
't': 0, # samples seen so far
'batch': 0, # samples seen in current epoch
'stop': False
}
state['optimizer'] = state['optim_method'](state['model'].parameters(), **state['optim_config'])
self.hooks['on_start'](state)             # Called this place, What's the meaning?
while state['epoch'] < state['max_epoch'] and not state['stop']:
state['model'].train()
self.hooks['on_start_epoch'](state)
state['epoch_size'] = len(state['loader'])
for sample in tqdm(state['loader'], desc="Epoch {:d} train".format(state['epoch'] + 1)):
state['sample'] = sample
self.hooks['on_sample'](state)   # Called the second place
state['optimizer'].zero_grad()
loss, state['output'] = state['model'].loss(state['sample'])
self.hooks['on_forward'](state)   # Called
loss.backward()
self.hooks['on_backward'](state)   # Called
state['optimizer'].step()
state['t'] += 1
state['batch'] += 1
self.hooks['on_update'](state)      # Called
state['epoch'] += 1
state['batch'] = 0
self.hooks['on_end_epoch'](state)
self.hooks['on_end'](state)          #  Called

我几乎是python和深度学习的新手,上面的代码是一个原型网络(https://github.com/jakesnell/prototypical-networks/blob/c9bb4d258267c11cb6e23f0a19242d24ca98ad8a/protonets/engine.py)。注释的lambda函数对我来说很奇怪。我试着打印type of (self.hooks'on_start')来帮助我实现一些东西,但我只得到' none '。我很困惑,有人能解释一下上面的代码是用来做什么的吗?

我很困惑为什么作者定义了一个什么都不做却调用了很多次的函数。

返回None的lambda函数在类的__init__方法中-它用于初始化self.hooks中的函数。

在使用时,作者为hooks中的每个键重新分配了一个新函数,因此当调用hooks[key]时,它不会什么都不做。代码在另一个python文件中重新分配了一个新函数,我没有找到它。