我正在检查一些代码,发现了以下函数:
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以下是从此处复制的简要说明,以防链接在某个时候失效。
\ndef 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\nRun Code Online (Sandbox Code Playgroud)\n
允许将参数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)
| 归档时间: |
|
| 查看次数: |
4696 次 |
| 最近记录: |