Python 3最佳实践:参数顺序

12

在这个问题中提到,自从Python3以后,您可以使用这种符号:

def func(a, b, *args, kw1=None, **kwargs)

为了定义一个函数,不再使用传统的Python2方式:

def func(a, b, kw1=None, *args, **kwargs)

是否有任何约定的最佳实践来确定应该使用哪种签名,还是基于个人偏好?


Python 3.5.2 实现的 PEP-448 带来了更多的变化。 - Jerzyk
1个回答

12

在这里无法有任何“最佳实践”,因为这两个定义意思不同(在某种程度上相反):

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指出这一点)。


2
“不能被称为func(1,2,3)”好吧,它可以,但3将进入args而不是kw1 - tobias_k
1
在第一个代码块之后,您混淆了“关键字”和“位置参数”。 - user3850
1
func(a, b, *,...) 是什么样的语法?我从未见过。你能提供一个参考吗? - tobias_k
1
@tobias_k 这是PEP 3102(“第二个语法变化是允许省略可变参数的参数名。”) - bereal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接