我正在摆弄PEP 570中指定并随Python 3.8引入的仅位置参数,我只是想知道一个特定的极端情况。
假设我定义了一个函数如下(无论这是好的设计还是有任何意义):
def func(p1, p2=None, p3=None, /):
print(p1, p2, p3)
所以有一个必需参数 ( p1
),后跟两个可选参数 (p2
和p3
)。我可以用 just p1
, p1
and p2
or p1
and p2
and来调用函数p3
:
func(1) # 1, None, None
func(1, 2) # 1, 2, None
func(1, 2, 3) # 1, 2, 3
但是我无法在保持默认 for 的同时使用p1
和参数调用它,因为我无法提供关键字参数:p3
p2
func(1, p3=3)
这当然会引发TypeError
:
TypeError: func() got some positional-only arguments passed as keyword arguments: 'p3'
我找不到关于这种情况的任何讨论或示例,因为PEP 570中的所有示例仅包含一个可选参数作为仅位置参数的一部分:
def name(p1, p2, /, p_or_kw, *, kw):
def name(p1, p2=None, /, p_or_kw=None, *, kw):
def name(p1, p2=None, /, *, kw):
def name(p1, p2=None, /):
def name(p1, p2, /, p_or_kw):
def name(p1, p2, /):
所以我的问题是:这是预期的行为,让调用者从左到右提供多个可选参数,以强制顺序覆盖它们吗?这实际上是仅位置参数的一个特征吗?