Когда использовать параметры по позиции, а когда по ключевому слову?

Рейтинг: 1Ответов: 1Опубликовано: 23.03.2023

В Python функциям можно передавать параметры по позиции и по ключевому слову
Вопрос: При написании своих функций как понять, что "эту" переменную следует передавать по ключу, а "эту" по позиции?
P.S. Не с точки зрения синтаксиса, а с точки зрения смысла

В PEP 570 Нашёл следующее пояснение:

Позиционные параметры полезны в нескольких ситуациях, таких как:

  1. когда функция принимает любой ключевой аргумент, но также может принимать позиционный
  2. когда параметр не имеет внешнего смыслового значения
  3. когда параметры API обязательны и недвусмысленны

Мне понятна строка про внешнее смысловое значение и параметры API, но я не совсем понимаю первый пункт. Несмотря на то, что в PEP даже приводят пример. Я всё равно как-то не могу к умозаключению. Подскажите, пожалуйста

Ответы

▲ 1

Когда вы пишете свою функцию - то вы никому ничего не должны, вы пишете ее так как хотите вы. И в таком случае выбор между двумя формами передачи параметров вы делаете из соображений 1) упрощения дальнейшего использования вашей функции теми, кто будет к ней обращаться (и вы сами в том числе) и 2) упрощения дальнейшего изучения вашей функции, а возможно - ее модификации (что можете делать и вы сами, и возможно кто другой). Помните, что в Python к параметру заданному ключем, можно обращаться и по позиции. Вот четыре равнозначные вызовы одной и той-же функции:

def quotient(dividend, divisor):
    return dividend/divisor
print(quotient(dividend=10, divisor=2))
print(quotient(divisor=2, dividend=10))
print(quotient(10, divisor=2))
print(quotient(10, 2)) 

Когда проще НЕ ошибиться при вызове?

С другой стороны, при вызове функции

def addition(summand1 , summand2) :
    return summand1 + summand2
print(addition(summand1=10, summand2=2))
print(addition(10, 2))

также возможны аналогичные четыре варианта, но зачем усложнять вашу программу?

А вот в таком случае

def in_half (dividend, divisor=2):
    return dividend/divisor
print(in_half(dividend=10))
print(in_half(10))

оба варианта практически однозначны для понимания.

Т.е. еще раз, выбор всегда за вами и вы должны исходить из критерия читабельности (понятности) кода, который вы пишете.