web-dev-qa-db-fra.com

Est-il possible de passer des paramètres facultatifs à une fonction?

Existe-t-il un moyen dans Python de transmettre des paramètres facultatifs à une fonction tout en l'appelant et dans la définition de la fonction un code basé sur "uniquement si le paramètre facultatif est passé"

122
user1795998

La documentation Python 2, 7.6. Définitions des fonctions vous permet de détecter de différentes manières 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 *, alors 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 la fonction a un paramètre formel précédé de **, alors 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 optionnel" du type souhaité.

Par exemple, voici une fonction opt_fun qui prend deux paramètres de position x1 et x2, et cherche 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 valeur telle que 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 a une valeur autre que celle par défaut, vous savez qu'elle provient de l'appelant.

110
Jim DeLaHunt
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:
        ...
76
warvariuc
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. 
20
Sanyal

Si vous voulez donner une valeur par défaut à un paramètre, attribuez une valeur entre (). comme (x = 10). Mais il est important que l'argument obligatoire soit le premier, puis la valeur par défaut.

par exemple.

(y, x = 10)

mais

(x = 10, y) est faux

7
sumit

Vous pouvez spécifier une valeur par défaut pour l'argument facultatif avec quelque chose qui ne serait jamais transmis à 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 ferez pas func(_NO_DEFAULT) vous pourrez 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