在这个问题中提到,自从Python3以后,您可以使用这种符号:
def func(a, b, *args, kw1=None, **kwargs)
为了定义一个函数,不再使用传统的Python2方式:
def func(a, b, kw1=None, *args, **kwargs)
是否有任何约定的最佳实践来确定应该使用哪种签名,还是基于个人偏好?
在这里无法有任何“最佳实践”,因为这两个定义意思不同(在某种程度上相反):
def func(a, b, kw1=None, *args, **kwargs):
...
意味着该函数将有一个可选的命名参数kw1
,可以作为关键字(func(1, 2, kw1=3)
)或位置参数(func(1, 2, 3)
)传递。(事实上,除非使用相对较新的/
语法明确指定,任何命名参数都可以作为关键字传递。)
然而,如果命名参数跟在*args
(或者只是*
)后面,则只能作为关键字传递。例如:
def func(a, b, *, kw1=None, **kwargs):
...
不能被称为func(1, 2, 3)
,也拥有
def func(a, b, *args, kw1=None, **kwargs):
print(a, b, kw1)
func(1, 2, 3)
将打印出1, 2, None
,因为位置参数进入了*args
部分。(感谢@tobias_k指出这一点)。
3
将进入args
而不是kw1
。 - tobias_kfunc(a, b, *,...)
是什么样的语法?我从未见过。你能提供一个参考吗? - tobias_k