Utiliser des arguments variables en Python

Effectué

En Python, vous pouvez utiliser n’importe quel nombre d’arguments et d’arguments par mots clés sans avoir à déclarer chacun d’eux. Cela est utile quand une fonction peut avoir un nombre inconnu d’entrées.

Arguments variables

Les arguments des fonctions sont obligatoires. Toutefois, quand vous utilisez des arguments variables, la fonction permet de passer n’importe quel nombre d’arguments (notamment 0). La syntaxe d’utilisation des arguments variables consiste à placer un seul astérisque (*) avant le nom de l’argument.

La fonction suivante affiche les arguments reçus :

def variable_length(*args):
    print(args)

Notes

Il n’est pas nécessaire d’appeler les arguments variables args. Vous pouvez utiliser n’importe quel nom de variable valide. Bien qu’il soit courant de voir *args ou *a, essayez d’utiliser la même convention tout au long d’un projet.

Dans le cas présent, *args indique à la fonction d’accepter un nombre quelconque d’arguments (0 inclus). Dans la fonction, args est désormais disponible en tant que variable contenant tous les arguments sous forme de tuple. Testez la fonction en passant des arguments dont vous faites varier le nombre ou le type :

variable_length()
()
variable_length("one", "two")
('one', 'two')
variable_length(None)
(None,)

Comme vous pouvez le voir, il n’existe aucune restriction sur le nombre ou le type des arguments passés.

Le lancement d’une fusée passe par plusieurs étapes. En fonction des tâches ou des retards, ces étapes peuvent prendre plus de temps que prévu. Créons une fonction de longueur variable qui peut calculer le nombre de minutes avant un lancement, en fonction de la durée de chaque étape :

def sequence_time(*args):
    total_minutes = sum(args)
    if total_minutes < 60:
        return f"Total time to launch is {total_minutes} minutes"
    else:
        return f"Total time to launch is {total_minutes/60} hours"

Testez la fonction en passant un nombre quelconque de minutes :

sequence_time(4, 14, 18)
Total time to launch is 36 minutes.
sequence_time(4, 14, 48)
Total time to launch is 1.1 hours.

Notes

Quand vous utilisez des arguments variables, les valeurs ne se voient plus affecter un nom de variable. Toutes les valeurs font désormais partie du nom de variable attrape-tout qui utilise l’astérisque (args dans ces exemples).

Arguments par mots clés variables

Pour qu’une fonction accepte un nombre quelconque d’arguments par mots clés, vous devez utiliser une syntaxe similaire. Dans le cas présent, un double astérisque est nécessaire :

def variable_length(**kwargs):
    print(kwargs)

Testez cet exemple de fonction, qui affiche les noms et les valeurs passés en tant que kwargs :

variable_length(tanks=1, day="Wednesday", pilots=3)
{'tanks': 1, 'day': 'Wednesday', 'pilots': 3}

Si vous êtes déjà habitué aux dictionnaires Python, vous noterez que les arguments par mots clés de longueur variable sont affectés sous la forme d’un dictionnaire. Pour interagir avec les variables et les valeurs, utilisez les mêmes opérations sous la forme d’un dictionnaire.

Notes

Comme pour les arguments variables, vous n’êtes pas obligé d’utiliser kwargs quand vous utilisez des arguments par mots clés variables. Vous pouvez utiliser n’importe quel nom de variable valide. Bien qu’il soit courant de voir **kwargs ou **kw, essayez d’utiliser la même convention tout au long d’un projet.

Dans cette fonction, utilisons des arguments par mots clés variables pour indiquer quels sont les astronautes affectés à la mission. Dans la mesure où cette fonction accepte un nombre quelconque d’arguments par mots clés, elle peut être réutilisée quel que soit le nombre d’astronautes affectés :

def crew_members(**kwargs):
    print(f"{len(kwargs)} astronauts assigned for this mission:")
    for title, name in kwargs.items():
        print(f"{title}: {name}")

Testez-la avec l’équipage d’Apollo 11 :

crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", command_pilot="Michael Collins")
3 astronauts assigned for this mission:
captain: Neil Armstrong
pilot: Buzz Aldrin
command_pilot: Michael Collins

Dans la mesure où vous pouvez passer n’importe quelle combinaison d’arguments par mots clés, veillez à éviter la répétition des mots clés. La répétition des mots clés entraîne une erreur :

crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", pilot="Michael Collins")
  File "<stdin>", line 1
SyntaxError: keyword argument repeated: pilot