Есть ли способ в Python передавать необязательные параметры функции при ее вызове, а в определении функции есть код, основанный на "только в том случае, если передан необязательный параметр"
Есть ли способ передать необязательные параметры функции?
Ответ 1
Документация Python 2, 7.6. Определения функций дают вам несколько способов определить, предоставил ли вызывающий код необязательный параметр.
Во-первых, вы можете использовать специальный формальный синтаксис параметров *
. Если определение функции имеет формальный параметр, которому предшествует одиночный *
, тогда Python заполняет этот параметр любыми позиционными параметрами, которые не соответствуют предыдущим формальным параметрам (как кортеж). Если определение функции имеет формальный параметр, которому предшествует **
, тогда Python заполняет этот параметр любыми параметрами ключевого слова, которые не соответствуют предыдущим формальным параметрам (как dict). Реализация функции может проверять содержимое этих параметров для любых "необязательных параметров" того типа, который вы хотите.
Например, здесь функция opt_fun
, которая принимает два позиционных параметра x1
и x2
, и ищет другой параметр ключевого слова с именем "optional".
>>> 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
, которое вызывающий не использовал бы. Если параметр имеет это значение по умолчанию, вы знаете, что вызывающий не указал параметр. Если параметр имеет значение, отличное от значения по умолчанию, вы знаете, что он пришел от вызывающего.
Ответ 2
def my_func(mandatory_arg, optional_arg=100):
print(mandatory_arg, optional_arg)
http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
Я считаю это более читабельным, чем использование **kwargs
.
Чтобы определить, был ли передан аргумент вообще, я использую пользовательский служебный объект в качестве значения по умолчанию:
MISSING = object()
def func(arg=MISSING):
if arg is MISSING:
...
Ответ 3
def op(a=4,b=6):
add = a+b
print add
i)op() [o/p: will be (4+6)=10]
ii)op(99) [o/p: will be (99+6)=105]
iii)op(1,1) [o/p: will be (1+1)=2]
Note:
If none or one parameter is passed the default passed parameter will be considered for the function.
Ответ 4
Если вы хотите дать некоторое значение по умолчанию для значения назначения параметра в(). (x = 10). Но важно, прежде всего, обязательный аргумент, а затем значение по умолчанию.
например.
(y, x = 10)
но
(x = 10, y) неверно
Ответ 5
Вы можете указать значение по умолчанию для необязательного аргумента с чем-то, что никогда не передавалось функции и проверять его с помощью оператора is
:
class _NO_DEFAULT:
def __repr__(self):return "<no default>"
_NO_DEFAULT = _NO_DEFAULT()
def func(optional= _NO_DEFAULT):
if optional is _NO_DEFAULT:
print("the optional argument was not passed")
else:
print("the optional argument was:",optional)
то до тех пор, пока вы не выполняете func(_NO_DEFAULT)
, вы можете точно определить, прошел ли аргумент или нет, и в отличие от принятого ответа вам не нужно беспокоиться о побочных эффектах ** нотации:
# these two work the same as using **
func()
func(optional=1)
# the optional argument can be positional or keyword unlike using **
func(1)
#this correctly raises an error where as it would need to be explicitly checked when using **
func(invalid_arg=7)