Python 3最佳实践参数顺序

PKu*_*uhn 7 python

在这个问题中,描述了自Python3以来你可以使用这种表示法:

def func(a, b, *args, kw1=None, **kwargs)
Run Code Online (Sandbox Code Playgroud)

定义一个函数,而不是传统的Python2方式:

def func(a, b, kw1=None, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

是否有任何商定的最佳做法,应使用哪种签名,还是基于个人喜好?

ber*_*eal 6

这里没有任何"最佳"做法,因为这两个定义意味着不同(在某种程度上,相反)的事情:

def func(a, b, kw1=None, *args, **kwargs):
    ...
Run Code Online (Sandbox Code Playgroud)

表示该函数将具有可选的命名参数kw1,该参数可以作为关键字(func(1, 2, kw1=3))或位置参数(func(1, 2, 3))传递.(实际上,除非使用相对较新的/-syntax 明确指定,否则任何命名参数都可以作为关键字传递.)

但是,如果命名参数后面*args(或只是*),它可能作为关键字传递.例如:

def func(a, b, *, kw1=None, **kwargs):
    ...
Run Code Online (Sandbox Code Playgroud)

不能被称为func(1, 2, 3)和拥有

def func(a, b, *args, kw1=None, **kwargs):
    print(a, b, kw1)
Run Code Online (Sandbox Code Playgroud)

func(1, 2, 3)将打印1, 2, None,因为位置参数转到该*args部分.(感谢@tobias_k指出这一点).

  • 可以,“不能被称为func(1,2,3)”,但是`3`将会进入`args`,而不是`kw1` (2认同)