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

时间:2019-07-08 17:07:43

标签: python

我正在浏览一些代码,并且遇到了以下函数:

def foo(self, arg1=1, *, arg2=2):
    pass

我很惊讶地看到*左侧的关键字参数,即位置参数。然后,我注意到可以通过以下两种方式呼叫foo

>>> foo(1)
>>> foo(arg1=1)

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

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

4 个答案:

答案 0 :(得分:2)

可以将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): ...

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

def name(positional_or_keyword_parameters, *, keyword_only_parameters): ...

答案 1 :(得分:2)

我发现最能最好地描述这句话的是:

这里的窍门是要认识到“关键字参数”是调用站点的概念,而不是声明。但是,“仅关键字参数”是声明的概念,而不是调用站点。

找到here

答案 2 :(得分:0)

尽管语法相似,但关键字参数与具有默认值的参数之间没有关系。

key=value既用于在定义时为 parameter 分配默认值,又在函数使用时为参数传递参数被称为

可以使用关键字参数分配不带默认值的参数:

def foo(a):
    return a + 3

assert foo(a=5) == 8

可以分配不带关键字参数的默认值的参数:

def foo(a=5):
    return a + 3

assert foo() == 8
assert foo(1) == 4

答案 3 :(得分:0)

使用类似参数的*是一个复杂的答案(Python版本,请定义并使用它)。

在您的情况下:

aria-label="sidebar"

请注意: 尝试使用它,看看区别(没有self):

>>> foo(1,2,)
>>> foo(1,2)
  • 一颗星*定义位置参数(您可以接收任意数量的参数并将传递的参数视为元组);
  • 两颗星**定义关键字参数。

一个很好的例子来自this tutorial(不含位置参数部分的仅关键字参数):

>>> def foo( arg1=1, *, arg2=2):
...     pass
...
>>> foo(arg1=1,arg2=2)
>>> def foo( arg1=1, *, arg2=2):
...     pass
...
>>> foo(arg1=1,arg2=2)
>>> foo(arg1=1)
>>> foo(arg1=1,)
>>> foo(arg2=2)
>>> foo(arg2=2,1)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
>>> foo(2,1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes from 0 to 1 positional arguments but 2 were given
>>> foo(arg1=1,2)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

其值可以作为位置参数发送。

有关参数的更多信息,请参见this tutorial

Python 3.x在PEP-3102中引入了更直观的仅关键字参数(您可以在参数列表中指定*)。

一个不错的替代答案是this