Я возился с позиционными параметрами, указанными в PEP 570 и представлен с Python 3.8 , и мне просто интересно узнать конкретный угловой случай.
Допустим, я определяю функцию следующим образом (независимо от того, является ли это хорошим дизайном или имеет какой-либо смысл):
def func(p1, p2=None, p3=None, /):
print(p1, p2, p3)
Итак, есть один обязательный параметр (p1
), за которым следуют дванеобязательные параметры (p2
и p3
). Я могу вызвать функцию с помощью p1
, p1
и p2
или p1
и p2
и p3
:
func(1) # 1, None, None
func(1, 2) # 1, 2, None
func(1, 2, 3) # 1, 2, 3
Но я не могу просто вызватьэто с 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, /):
Таким образом, мой вопрос таков: является ли это предполагаемым поведением, когда вызывающая сторона предоставляет несколько необязательных аргументов слева направо, переопределяя их в принудительном порядке? Это на самом деле особенность позиционных аргументов?