Existe uma maneira no Python de passar parâmetros opcionais para uma função enquanto a chama e na definição da função tem algum código com base em "somente se o parâmetro opcional for passado"
A documentação do Python 2, 7.6. As definições de função oferecem algumas maneiras de detectar se um chamador forneceu um parâmetro opcional.
Primeiro, você pode usar sintaxe de parâmetro formal especial *
. Se a definição da função tiver um parâmetro formal precedido por um único *
, o Python preencherá esse parâmetro com quaisquer parâmetros posicionais que não correspondam aos parâmetros formais anteriores (como uma tupla). Se a definição da função tiver um parâmetro formal precedido por **
, o Python preencherá esse parâmetro com qualquer parâmetro de palavra-chave que não seja correspondido pelos parâmetros formais anteriores (como um ditado). A implementação da função pode verificar o conteúdo desses parâmetros para quaisquer "parâmetros opcionais" da classificação que você deseja.
Por exemplo, aqui está uma função opt_fun
que recebe dois parâmetros posicionais x1
e x2
, e procura por outro parâmetro palavra-chave chamada "opcional".
>>> 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
Segundo, você pode fornecer um valor de parâmetro padrão de algum valor como o None
que um chamador nunca usaria. Se o parâmetro tiver esse valor padrão, você sabe que o chamador não especificou o parâmetro. Se o parâmetro tiver um valor não padrão, você sabe que veio do chamador.
positional_parameters
é uma tupla ekeyword_parameters
um dicionário.formal parameters preceded by *
(como isso é chamado?) De umkeyword parameter
? Pelo que entendi, os parâmetros de palavra-chave são especificados usando o=
operador na chamada de função (opt_fun(1,2, optional="yes")
fornece um argumento de palavra-chave "yes" para uma função que antecipa, mas não exige necessariamente, o parâmetrooption
).formal parameters preceded by *
simplesmente "os argumentos fornecidos pelo chamador que não correspondem aos argumentos posicionais anteriores a qualquer argumento de palavra-chave". Por exemplo, emopt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018")
,"blah"
e3.14
sãoforma arguments preceded by *
porque está em entre os dois argumentos posicionais e o argumento de que utiliza o=
sinal. A tupla resultantepositional_parameter
seria a duple:("blah", 3.14)
. Isso está correto?parameter
" não "parameters
" para "preceded by *
". O idioma permite apenas um*identifier
na lista de parâmetros. b) leia docs.python.org/2/reference/… , c) leia docs.python.org/2/reference/expressions.html#calls . Desculpe, a falta de caracteres é permitida neste comentário.http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
Acho isso mais legível do que usar
**kwargs
.Para determinar se um argumento foi passado, eu uso um objeto de utilitário personalizado como o valor padrão:
fonte
default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
fonte
op(b=2)
Se você deseja atribuir algum valor padrão a um parâmetro, atribua o valor em (). como (x = 10). Mas importante é o primeiro argumento obrigatório, depois o valor padrão.
por exemplo.
(y, x = 10)
mas
(x = 10, y) está errado
fonte
*arg
**karg
como argumentos de função. pesquise no google.Você pode especificar um valor padrão para o argumento opcional com algo que nunca seria passado para a função e verificá-lo com o
is
operador:desde que não o faça,
func(_NO_DEFAULT)
você poderá detectar com precisão se o argumento foi aprovado ou não e, diferentemente da resposta aceita, você não precisa se preocupar com os efeitos colaterais da ** notação:fonte
_NO_DEFAULT = object()
.help(func)
terá uma idéia mais clara de como o argumento é interpretado se não for passado explicitamente.