Python函数传参报错:SyntaxError: non-keyword arg after keyword arg 求解
问题根源
你遇到的SyntaxError: non-keyword arg after keyword arg错误,本质是在构建请求参数字典时,违反了Python的参数传递语法规则:
- 当用
dict(key1=val1, key2=val2)这种关键字参数形式创建字典时,所有传入的参数都必须是key=value的键值对格式。 - 你在
procedureName=procedure和projectName=project这两个关键字参数之后,直接塞了一个setParams(...)函数调用——这属于位置参数,Python不允许关键字参数出现在位置参数之前,因此直接触发语法错误。
另外你的逻辑也有小问题:setParams返回的是一个包含parameters键的字典,你需要把这个键值对合并到请求参数里,而不是把函数调用直接丢在dict()的参数列表中。
修正后的代码
这里提供两种修复方式,你可以根据习惯选择:
方式1:用字典解包合并参数(更简洁)
def setParams(params): retList=[] for param in params: retList.append(dict(actualParameterName=param,value=params[param])) return dict(parameters=dict(actualParameter=retList)) def runProcedure(procedure, project, invalidlyValidArguments): # 合并所有请求参数:基础参数 + setParams返回的参数 request_params = { 'procedureName': procedure, 'projectName': project, **setParams(invalidlyValidArguments) # 用**解包字典,把parameters键加入进来 } print(cmdr.httpPost(cmdr.makeEnvelope( cmdr.createRequest('runProcedure', request_params) ))) # 调用测试 runProcedure( procedure='Build_Single_Module_For_Every_Config', project='My-module', invalidlyValidArguments={'moduleSelection':'Some_Handler','hakuna':'mattata'} )
方式2:显式指定parameters键(更直观)
def runProcedure(procedure, project, invalidlyValidArguments): print(cmdr.httpPost(cmdr.makeEnvelope( cmdr.createRequest('runProcedure', dict( procedureName=procedure, projectName=project, # 直接取出setParams返回的parameters值 parameters=setParams(invalidlyValidArguments)['parameters'] )) )))
为什么去掉params=还是报错?
即使你把setParams(params=invalidlyValidArguments)改成setParams(invalidlyValidArguments),本质还是在dict(procedureName=..., projectName=..., setParams(...))里把位置参数放在了关键字参数之后——这依然违反Python的参数顺序规则(关键字参数必须在所有位置参数之后),所以错误不会消失。
内容的提问来源于stack exchange,提问作者saterHater
相关产品推荐
相关产品推荐

