调用含*args的Python函数时遇意外关键字参数问题求助
解决方案
错误原因分析
你遇到的两个问题本质是对Python可变位置参数(*aspects)的传参规则理解偏差:
- 第一个报错:
*aspects是可变位置参数,仅支持位置传递,不能用aspects='xxx'这种关键字参数形式传入。 - 第二个报错:你把
'minimalsample'放在第一个位置,它会被匹配到identity参数,之后又通过identity=identity显式赋值,导致同一个参数被重复传递,触发multiple values错误。
正确调用方式
想要保留关键字参数的可读性,同时正确传递可变位置参数,推荐两种写法:
写法一:用*解包传递可变位置参数
将需要传入aspects的内容打包成元组(或列表),用*解包后放在关键字参数之后:
destination = RNS.Destination( identity=identity, direction=RNS.Destination.IN, type=RNS.Destination.SINGLE, app_name=APP_NAME, *('minimalsample',) # 单元素元组末尾必须加逗号,避免被识别为普通括号 )
如果需要传递多个aspects值,直接扩展元组即可:
*('aspect1', 'aspect2', 'aspect3')
写法二:直接将aspects作为位置参数放在最后
若仅需传递一个aspects值,也可以直接把它放在所有关键字参数的末尾(Python允许位置参数跟在关键字参数之后,只要参数不冲突):
destination = RNS.Destination( identity=identity, direction=RNS.Destination.IN, type=RNS.Destination.SINGLE, app_name=APP_NAME, 'minimalsample' )
这两种写法既保证了核心参数的可读性,又符合可变位置参数的传参规则,能避免报错。
内容的提问来源于stack exchange,提问作者Dieter Vansteenwegen
相关产品推荐
相关产品推荐

