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é"

104
demandé sur martineau 2012-12-24 10:41:24

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.

98
répondu Jim DeLaHunt 2016-01-09 06:24:10
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:
        ...
57
répondu warvariuc 2017-11-02 09:50:16
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. 
18
répondu Sanyal 2017-08-18 06:02:02

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

5
répondu sumit 2012-12-24 06:49:04

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)
2
répondu Tadhg McDonald-Jensen 2016-04-01 19:21:28