我需要做类似于以下的事情:
生成输出:
但这意味着这个调用:
将
def func1(a, *args, b="BBB", **kwargs):
print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, kwargs)
这样调用:
func1("AAAA", h="HHH", j="JJJ")
生成输出:
a=AAAA b=BBB args=() kwargs={'h': 'HHH', 'j': 'JJJ'}
但是不可能在*args
之后放置一个默认的命名参数。(SyntaxError: invalid syntax
)
- 为什么不允许这样做?
- 有没有一种可读性更好的实现方式?我唯一知道的方法是
b=kwargs.pop("b", "BBB")
,但这并不是非常易读。我更喜欢将其放在函数调用定义中,因为它是一个参数,它将始终具有一个值,无论是默认值还是用户给定的值。
编辑
我可以将b
放在args
之前:
def func1(a, b="BBB", *args, **kwargs):
print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, kwargs)
但这意味着这个调用:
func1("AAAA", "CCC", h="HHH", j="JJJ")
将
"CCC"
分配给 b
,但我不想要这个。我希望 b
成为一个命名参数,而不是一个位置参数。