Ecrire des fonctions qui acceptent un nombre arbitraire d’arguments en Python

Vous voulez écrire une fonction qui accepte n’importe quel nombre d’arguments d’entrée. Pour écrire une fonction qui accepte un nombre quelconque de paramètres positionnels, utilisez un argument *. Par exemple:

def moyenne(premier, *rest):
    return (premier + sum(rest)) / (1 + len(rest))

# Exemple d'utilisation
moyenne(1, 2)          # 1.5
moyenne(1, 2, 3, 4)    # 2.5

Dans cet exemple, rest est un tuple de tous les arguments positionnels supplémentaires de la fonction. Le code le traite comme une séquence dans l’exécution des calculs ultérieurs.

Pour accepter n’importe quel nombre d’arguments, utilisez un paramètre qui commence par **. Par exemple:

import html

def creer_element(nom, valeur, **attrs):
    vals_cles = [' %s="%s"' % item for item in attrs.items()]
    attr_ch = ''.join(vals_cles)
    element = '<{nom}{attrs}>{valeur}</{nom}>'.format(
                  nom=nom,
                  attrs=attr_ch,
                  valeur=html.escape(valeur))
    return element

# Exemple
# Créer '<item size="large" quantity="6">Espèces</item>'
creer_element('item', 'Espèces', size='large', quantity=6)

# Creates '<p>&lt;spam&gt;</p>'
creer_element('p', '<spam>')

Ici, attrs est un dictionnaire qui contient les arguments mots-clés (le cas échéant).

Si vous voulez une fonction qui peut accepter à la fois un nombre quelconque d’arguments positionnels et de mots-clés uniquement, utilisez * et ** ensemble. Par exemple:

def anyargs(*args, **kwargs):
    print(args)      # un tuple
    print(kwargs)    # un dictionnaire

Avec cette fonction, tous les arguments positionnels sont placés dans un tuple args, et tous les arguments mots-clés sont placés dans un dictionnaire kwargs.

Un argument * ne peut apparaître que comme le dernier argument positionnel dans une définition de fonction. Un argument ** ne peut apparaître que comme dernier argument.

Un aspect subtil des définitions de fonctions est que les arguments peuvent toujours apparaître après un argument *.

def a(x, *args, y):
    pass

def b(x, *args, y, **kwargs):
    pass

De tels arguments sont connus sous le nom d’arguments de mots-clés seulement, et sont discutés plus en détail dans l’article “Écrire des fonctions qui n’acceptent que des arguments de mots-clés“.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here