Я возился с позиционными параметрами, как указано в 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, /):
Итак, мой вопрос: является ли это предполагаемым поведением, чтобы вызывающая сторона предоставляла несколько необязательных аргументов слева направо, переопределяя их в принудительном порядке? Действительно ли это особенность позиционных аргументов?
"Is that the intended behavior, to have a caller provide multiple optional arguments from left to right, overriding them in a forced order? Is this actually a feature of positional-only arguments?"
Возможно, я вас неправильно понял, но это не только предполагаемое поведение позиционных аргументов, но и его определение. - person DeepSpace   schedule 30.10.2019func(1, p3=3)
прямо противоречит использованию/
в определении функции, поскольку он предоставляет аргумент ключевого слова для функции, которая принимает только позиционные аргументы. Тот факт, чтоp2
имеет значение по умолчанию, не имеет значения. - person DeepSpace   schedule 30.10.2019