在这个question中,描述了自Python3以来你可以使用这种表示法:
def func(a, b, *args, kw1=None, **kwargs)
定义一个函数,而不是传统的Python2方式:
def func(a, b, kw1=None, *args, **kwargs)
是否有任何商定的最佳做法应使用哪种签名或是否基于个人偏好?
答案 0 :(得分:6)
没有任何"最好的"在这里练习,因为这两个定义意味着不同(在某种程度上,相反):
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指出这一点。)