Existe-t-il un moyen de passer des paramètres optionnels à une fonction?
Existe-t-il un moyen en Python de passer des paramètres optionnels à une fonction tout en l'appelant et dans la définition de la fonction avoir du code basé sur "seulement si le paramètre optionnel est passé"
5 réponses
La documentation Python 2, 7.6. Définitions de fonction Vous donne quelques 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 la 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 (en tant que tuple). Si la définition de la fonction est formel paramètre précédé de **
, puis Python remplit ce paramètre avec tous les paramètres de mot-clé qui ne correspondent pas aux paramètres formels précédents (en tant que dict). L'implémentation de la fonction peut vérifier le contenu de ces paramètres pour tous les "paramètres facultatifs" du genre que vous voulez.
Par exemple, voici une fonction {[4] } qui prend deux paramètres de position x1
et x2
, et recherche un autre paramètre de mot-clé nommé "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
Deuxièmement, vous pouvez fournir un défaut valeur de paramètre d'une valeur comme None
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 de valeur par défaut, vous savez qu'il provient de l'appelant.
def my_func(mandatory_arg, optional_arg=100):
print mandatory_arg, optional_arg
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é, j'utilise un objet utilitaire personnalisé comme valeur par défaut:
MISSING = object()
def func(arg=MISSING):
if arg is MISSING:
...
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.
Si vous voulez donner une valeur par défaut à un paramètre attribuer une valeur dans (). comme (x =10). Mais important est d'abord devrait argument obligatoire puis valeur par défaut.
Par exemple.
(y, x = 10)
Mais
(x=10, y) est faux
Vous pouvez spécifier une valeur par défaut pour l'argument optionnel avec quelque chose qui ne serait jamais passé à la fonction et le vérifier avec l'opérateur 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)
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**:
# 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)