Existe-t-il un moyen en Python de passer des paramètres optionnels à une fonction lors de son appel et dans la définition de la fonction avoir du code basé sur "uniquement si le paramètre optionnel est passé"
La documentation Python 2, 7.6. Les définitions de fonction vous offrent plusieurs façons de détecter si un appelant a fourni un paramètre facultatif.
Tout d'abord, vous pouvez utiliser une syntaxe de paramètre formel spéciale *
. Si la définition de fonction a un paramètre formel précédé d'un seul *
, Python remplit ce paramètre avec tous les paramètres de position qui ne correspondent pas aux paramètres formels précédents (sous forme de tuple). Si la définition de fonction a un paramètre formel précédé de **
, Python remplit ce paramètre avec tous les paramètres de mot-clé qui ne correspondent pas aux paramètres formels précédents (sous forme de dict). L'implémentation de la fonction peut vérifier le contenu de ces paramètres pour tout "paramètre facultatif" du type souhaité.
Par exemple, voici une fonction opt_fun
qui prend deux paramètres de position x1
et x2
, et recherche un autre paramètre de mot-clé nommé "facultatif".
>>> 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
Deuxièmement, vous pouvez fournir une valeur de paramètre par défaut d'une certaine valeur comme None
celle qu'un appelant n'utiliserait jamais. Si le paramètre a cette valeur par défaut, vous savez que l'appelant n'a pas spécifié le paramètre. Si le paramètre n'a pas une valeur par défaut, vous savez qu'il provient de l'appelant.
positional_parameters
est un tuple etkeyword_parameters
un dictionnaire.formal parameters preceded by *
(comment s'appelle-t-il?) D'unkeyword parameter
? Comme je l'ai compris, les paramètres de mot-clé sont spécifiés à l'aide de l'=
opérateur dans l'appel de fonction (opt_fun(1,2, optional="yes")
fournit donc un argument de mot-clé "oui" pour une fonction qui anticipe, mais ne nécessite pas nécessairement, le paramètreoption
).formal parameters preceded by *
simplement "les arguments fournis par l'appelant qui ne correspondent pas aux arguments positionnels qui précèdent les arguments de mot-clé". Par exemple, dansopt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018")
,"blah"
et3.14
sontforma arguments preceded by *
parce qu'il est entre les deux arguments de position et l'argument qui utilise le=
signe. Le tuple résultantpositional_parameter
serait le rythme binaire:("blah", 3.14)
. Est-ce correct?parameter
" pas "parameters
" pour "preceded by *
". La langue n'en autorise qu'un*identifier
dans la liste des paramètres. b) lire docs.python.org/2/reference/… , c) lire docs.python.org/2/reference/expressions.html#calls . Désolé, il n'y a plus de caractères autorisés dans ce commentaire.http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
Je trouve cela plus lisible que d'utiliser
**kwargs
.Pour déterminer si un argument a été passé du tout, j'utilise un objet utilitaire personnalisé comme valeur par défaut:
la source
default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
la source
op(b=2)
Si vous voulez donner une valeur par défaut à un paramètre, attribuez une valeur dans (). comme (x = 10). Mais il est important de commencer par l'argument obligatoire puis la valeur par défaut.
par exemple.
(y, x = 10)
mais
(x = 10, y) est faux
la source
*arg
**karg
comme arguments de fonction. recherche sur Google.Vous pouvez spécifier une valeur par défaut pour l'argument optionnel avec quelque chose qui ne serait jamais passé à la fonction et la vérifier avec l'
is
opérateur:alors tant que vous ne le faites pas,
func(_NO_DEFAULT)
vous pouvez détecter avec précision si l'argument a été passé ou non, et contrairement à la réponse acceptée, vous n'avez pas à vous soucier des effets secondaires de la notation **:la source
_NO_DEFAULT = object()
.help(func)
vous obtenez une idée plus claire de la façon dont l'argument est interprété s'il n'est pas passé explicitement.