如何跳过Python函数默认值参数,实现普通参数、*args与**kwargs的预期传值?
Python函数跳过默认值参数传值的解决方法
你的问题出在位置参数的分配逻辑上——第二个位置参数'2'会被自动赋值给q,覆盖了它的默认值。要实现跳过q直接传值给*args,有两种靠谱的方式:
方法一:把默认参数设为关键字-only参数(推荐)
调整函数定义,把*y放在默认参数q前面,这样q就变成了关键字-only参数,只能通过关键字传递,所有位置参数会被*y接收:
def f(x, *y, q='me', **z): print(x) print(q) print(y) print(z) f('1', '2', '3', '4', '5', '6', '7', '8', m=9, n=10)
运行结果完全符合预期:
x = '1'q = 'me'(默认值生效)y = ('2', '3', '4', '5', '6', '7', '8')z = {'m': 9, 'n': 10}
方法二:调用时显式指定默认值并解包位置参数
如果不想修改函数定义,你可以在调用时显式传递q='me',同时用*解包列表的方式把后续值传给*y(因为Python不允许位置参数出现在关键字参数之后):
def f(x, q='me', *y, **z): print(x) print(q) print(y) print(z) f('1', q='me', *['2', '3', '4', '5', '6', '7', '8'], m=9, n=10)
这种方式也能达到预期效果,但写法不如第一种简洁直观。
内容的提问来源于stack exchange,提问作者Abdelmoumene Ferroukhi
相关产品推荐
相关产品推荐

