Есть ли в Python способ передать необязательные параметры функции при ее вызове, и в определении функции есть некоторый код, основанный на «только если передан необязательный параметр»
Документация Python 2, 7.6. Определения функций дают вам несколько способов определить, предоставил ли вызывающий необязательный параметр.
Во-первых, вы можете использовать специальный синтаксис формальных параметров *
. Если в определении функции есть формальный параметр, которому предшествует единственный *
, то Python заполняет этот параметр любыми позиционными параметрами, которые не соответствуют предшествующим формальным параметрам (в виде кортежа). Если определению функции предшествует формальный параметр **
, то Python заполняет этот параметр любыми ключевыми параметрами, которые не совпадают с предшествующими формальными параметрами (как dict). Реализация функции может проверять содержимое этих параметров на предмет любых «необязательных параметров» нужного вам типа.
Например, вот функция , opt_fun
которая принимает два позиционных параметров x1
и x2
, и ищут другой ключевое слово параметр с именем «необязательно».
>>> def opt_fun(x1, x2, *positional_parameters, **keyword_parameters):
... if ('optional' in keyword_parameters):
... print 'optional parameter found, it is ', keyword_parameters['optional']
... else:
... print 'no optional parameter, sorry'
...
>>> opt_fun(1, 2)
no optional parameter, sorry
>>> opt_fun(1,2, optional="yes")
optional parameter found, it is yes
>>> opt_fun(1,2, another="yes")
no optional parameter, sorry
Во-вторых, вы можете указать значение параметра по умолчанию для некоторого значения, None
которое вызывающий абонент никогда бы не использовал. Если параметр имеет это значение по умолчанию, вы знаете, что вызывающая сторона не указала параметр. Если параметр имеет значение, отличное от значения по умолчанию, вы знаете, что оно пришло от вызывающего.
positional_parameters
кортеж иkeyword_parameters
словарь.formal parameters preceded by *
(как это называется?) Отkeyword parameter
? Насколько я понял, параметры ключевого слова указываются с помощью=
оператора в вызове функции (поэтомуopt_fun(1,2, optional="yes")
предоставляет аргумент ключевого слова «да» для функции, которая ожидает, но не обязательно требует, параметрoption
).formal parameters preceded by *
это просто как «аргументы, предоставленные вызывающей стороной, которые не соответствуют позиционным аргументам, предшествующим любым аргументам ключевого слова». Так , например, вopt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018")
,"blah"
и3.14
этоforma arguments preceded by *
потому , что между двумя позиционными аргументами и аргументом , который использует=
знак. Полученный кортежpositional_parameter
будет двухтактный:("blah", 3.14)
. Это верно?parameter
"неparameters
" для "preceded by *
". Язык допускает только один*identifier
параметр в списке. б) прочтите docs.python.org/2/reference/… , в) прочтите docs.python.org/2/reference/expressions.html#calls . Извините, в этом комментарии не хватает символов.http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
Я считаю это более читаемым, чем использование
**kwargs
.Чтобы определить, был ли вообще передан аргумент, я использую пользовательский служебный объект в качестве значения по умолчанию:
источник
default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
источник
op(b=2)
Если вы хотите присвоить параметру значение по умолчанию в (). как (x = 10). Но важно сначала обязательный аргумент, а затем значение по умолчанию.
например.
(у, х = 10)
но
(x = 10, y) неверно
источник
*arg
**karg
аргументами функции. поиск в гугле.Вы можете указать значение по умолчанию для необязательного аргумента с чем-то, что никогда не будет передаваться в функцию, и проверить его с помощью
is
оператора:тогда, пока вы этого не сделаете,
func(_NO_DEFAULT)
вы можете точно определить, был передан аргумент или нет, и, в отличие от принятого ответа, вам не нужно беспокоиться о побочных эффектах ** нотации:источник
_NO_DEFAULT = object()
.help(func)
вы получите более четкое представление, как интерпретируется аргумент, если он не передан явно.