Python Language Arguments de la fonction d'emballage


Exemple

Dans les fonctions, vous pouvez définir un certain nombre d'arguments obligatoires:

def fun1(arg1, arg2, arg3): 
    return (arg1,arg2,arg3)

qui rendra la fonction appelable uniquement lorsque les trois arguments sont donnés:

fun1(1, 2, 3)

et vous pouvez définir les arguments comme facultatifs, en utilisant les valeurs par défaut:

def fun2(arg1='a', arg2='b', arg3='c'):
    return (arg1,arg2,arg3)

vous pouvez donc appeler la fonction de différentes manières, par exemple:

fun2(1)              → (1,b,c)
fun2(1, 2)           → (1,2,c)
fun2(arg2=2, arg3=3) → (a,2,3)
...

Mais vous pouvez aussi utiliser la syntaxe déstructurant pour emballer des arguments, donc vous pouvez assigner des variables à l' aide d' une list ou d' un dict .

Emballage d'une liste d'arguments

Considérez que vous avez une liste de valeurs

l = [1,2,3]

Vous pouvez appeler la fonction avec la liste de valeurs en tant qu'argument en utilisant la syntaxe * :

fun1(*l)
# Returns: (1,2,3)
fun1(*['w', 't', 'f'])
# Returns: ('w','t','f')

Mais si vous ne fournissez pas une liste dont la longueur correspond au nombre d'arguments:

fun1(*['oops'])
# Raises: TypeError: fun1() missing 2 required positional arguments: 'arg2' and 'arg3'

Arguments sur les mots-clés d'emballage

Maintenant, vous pouvez également empaqueter des arguments en utilisant un dictionnaire. Vous pouvez utiliser l'opérateur ** pour demander à Python de décompresser le dict tant que valeurs de paramètre:

d = {
  'arg1': 1,
  'arg2': 2,
  'arg3': 3
}
fun1(**d)
# Returns: (1, 2, 3)

Lorsque la fonction ne contient que des arguments de position (ceux sans valeur par défaut), vous avez besoin que le dictionnaire contienne tous les paramètres attendus et qu'il n'y ait pas de paramètre supplémentaire, sinon vous obtiendrez une erreur:

fun1(**{'arg1':1, 'arg2':2})
# Raises: TypeError: fun1() missing 1 required positional argument: 'arg3'
fun1(**{'arg1':1, 'arg2':2, 'arg3':3, 'arg4':4})
# Raises: TypeError: fun1() got an unexpected keyword argument 'arg4'

Pour les fonctions qui ont des arguments facultatifs, vous pouvez empaqueter les arguments sous forme de dictionnaire de la même manière:

fun2(**d)
# Returns: (1, 2, 3)

Mais là, vous pouvez omettre des valeurs, car elles seront remplacées par les valeurs par défaut:

fun2(**{'arg2': 2})
# Returns: ('a', 2, 'c')

Et comme précédemment, vous ne pouvez pas donner de valeurs supplémentaires qui ne sont pas des paramètres existants:

fun2(**{'arg1':1, 'arg2':2, 'arg3':3, 'arg4':4})
# Raises: TypeError: fun2() got an unexpected keyword argument 'arg4'

Dans l'utilisation du monde réel, les fonctions peuvent avoir des arguments à la fois positionnels et facultatifs, et cela fonctionne de la même façon:

def fun3(arg1, arg2='b', arg3='c')
    return (arg1, arg2, arg3)

vous pouvez appeler la fonction avec une simple itération:

fun3(*[1])
# Returns: (1, 'b', 'c')
fun3(*[1,2,3])
# Returns: (1, 2, 3)

ou avec juste un dictionnaire:

fun3(**{'arg1':1})
# Returns: (1, 'b', 'c')
fun3(**{'arg1':1, 'arg2':2, 'arg3':3})
# Returns: (1, 2, 3)

ou vous pouvez utiliser les deux dans le même appel:

fun3(*[1,2], **{'arg3':3})
# Returns: (1,2,3)

Attention cependant, vous ne pouvez pas fournir plusieurs valeurs pour le même argument:

fun3(*[1,2], **{'arg2':42, 'arg3':3})
# Raises: TypeError: fun3() got multiple values for argument 'arg2'