Python 中位置函数参数的默认值?

Ren*_*mas 6 python

我正在检查一些代码,发现了以下函数:

def foo(self, arg1=1, *, arg2=2):
    pass
Run Code Online (Sandbox Code Playgroud)

*我很惊讶地看到关键字参数位于位置参数的左侧。然后我注意到我可以foo通过以下两种方式进行调用:

>>> foo(1)
>>> foo(arg1=1)
Run Code Online (Sandbox Code Playgroud)

我想我会期望第二次调用失败,因为我foo通过提供关键字来使用命名参数进行调用arg1

话虽如此,我在这两种情况下都使用位置参数,还是第二次调用foo命名参数?

Ren*_*mas 11

我发现最能描述这一点的最佳句子是:

\n

"这里的技巧是要认识到 \xe2\x80\x9c 关键字参数\xe2\x80\x9d 是调用站点的概念,而不是声明。但是 \xe2\x80\x9c 关键字参数\xe2\x80\x9d是声明的概念,而不是调用站点。

\n

以下是从此处复制的简要说明,以防链接在某个时候失效。

\n
def bar(a,    # <- this parameter is a normal python parameter\n        b=1,  # <- this is a parameter with a default value\n        *,    # <- all parameters after this are keyword only\n        c=2,  # <- keyword only argument with default value\n        d):   # <- keyword only argument without default value\n    pass\n
Run Code Online (Sandbox Code Playgroud)\n


Ric*_*ica 8

允许将参数arg1称为位置参数或关键字参数。

从 Python 3.8 开始,可以将某些参数仅指定为位置参数。参见PEP 570。在 3.8 之前,除非您编写 python C 扩展,否则这是不可能的。

3.8 语法如下所示(直接来自 PEP):

def name(positional_only_parameters, /, positional_or_keyword_parameters,
         *, keyword_only_parameters): ...
Run Code Online (Sandbox Code Playgroud)

...3.8 之前,唯一合法的语法是这样的:

def name(positional_or_keyword_parameters, *, keyword_only_parameters): ...
Run Code Online (Sandbox Code Playgroud)