Python中使用curry传递resume参数触发TypeError的问题咨询
问题:curry函数传参引发TypeError错误
现有代码
原curry调用
curry(nn_task, latplan.model.get(parameters["aeclass"]), path, train, train, val, val, parameters)
curry函数定义
def curry(fn,*args1,**kwargs1): return lambda *args,**kwargs: fn(*args1,*args,**{**kwargs1,**kwargs})
nn_task函数定义
def nn_task(network, path, train_in, train_out, val_in, val_out, parameters, resume=False): ....
错误场景
尝试传入关键字参数resume=True
调用代码:
curry(nn_task, latplan.model.get(parameters["aeclass"]), path, train, train, val, val, parameters, resume=True)
触发错误:
TypeError: nn_task() got multiple values for argument 'resume'
尝试传入位置参数True
调用代码:
curry(nn_task, latplan.model.get(parameters["aeclass"]), path, train, train, val, val, parameters, True)
触发错误:
TypeError: nn_task() takes from 7 to 8 positional arguments but 9 were given
解决方案
由于无法修改现有curry和nn_task函数,正确的做法是将resume=True作为关键字参数传递给curry,且调用curry返回的lambda时不再重复传递resume参数。
正确的调用代码:
curry(nn_task, latplan.model.get(parameters["aeclass"]), path, train, train, val, val, parameters, resume=True)
注:若调用返回的lambda时需要传入额外参数,需确保这些参数不会与
nn_task的已有参数冲突;若无需额外参数,直接调用lambda即可,此时nn_task会收到7个位置参数加上resume=True关键字参数,完全符合参数定义。
错误原因解析
- 场景1报错:若调用lambda时额外传递了
resume参数,会导致kwargs1中的resume=True与调用lambda时传入的resume参数合并后,向nn_task同时传递了位置参数形式和关键字参数形式的resume,引发参数冲突。 - 场景2报错:传入的
True会被加入args1,此时args1包含8个位置参数;若调用lambda时又传入了1个额外参数,fn(*args1,*args)就会向nn_task传递9个位置参数,超出其参数数量限制。
内容的提问来源于stack exchange,提问作者RandomFellow
相关产品推荐
相关产品推荐

