7.1 Obtenir tous les arguments d'une fonction
En Python, il existe plusieurs manières très pratiques pour obtenir, depuis l'intérieur d'une fonction, la liste de tous les paramètres qui lui ont été passés. Passons-les en revue.
Utiliser *args
*args
permet de passer un nombre variable
d'arguments positionnels (ordinaires) à une fonction. Ces arguments
sont empaquetés dans un tuple et peuvent être traités à l'intérieur
de la fonction.
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
Explication
La fonction print_numbers
accepte un nombre arbitraire
d'arguments positionnels, empaquetés dans le tuple args
. Nous pouvons parcourir
les arguments à l'intérieur de la fonction à l'aide d'une boucle for
.
Avantages
- Flexibilité: Permet de passer n'importe quel nombre d'arguments à une fonction.
- Polyvalence: Peut être utilisé pour des fonctions avec un nombre indéfini de paramètres.
Utiliser **kwargs
**kwargs
permet de passer un nombre variable d'arguments
nommés à une fonction. Ces arguments sont empaquetés dans un dictionnaire
et peuvent être traités à l'intérieur de la fonction.
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
Explication
La fonction print_person_info
accepte un nombre arbitraire
d'arguments nommés, empaquetés dans le dictionnaire kwargs
. Nous pouvons parcourir
les arguments à l'intérieur de la fonction avec la méthode items()
du dictionnaire.
Avantages
- Flexibilité: Permet de passer n'importe quel nombre d'arguments nommés à une fonction.
- Lisibilité: Les arguments nommés rendent les appels de fonction plus lisibles.
7.2 Spécification du type d'arguments
Arguments uniquement positionnels
Depuis Python 3.8 et ultérieur, il est possible de définir des fonctions avec
des arguments positionnels qui peuvent être passés uniquement par position. Cela se fait avec
le symbole /
dans la définition de la fonction.
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Sortie: Hello, Alice!
greet("Alice", greeting="Hi") # Sortie: Hi, Alice!
# greet(name="Alice") # Erreur: TypeError
Explication
La fonction greet
accepte l'argument name
, qui ne peut être passé que
par position. Les arguments
avant /
peuvent être passés uniquement par position.
Cette approche permet de restreindre la manière de passer des arguments, améliorant la lisibilité et évitant des erreurs.
Arguments uniquement nommés (Keyword-Only Arguments)
Il est également possible de définir des paramètres de fonction qui ne peuvent être
passés que par nom. Cela se fait avec le symbole *
dans la définition
de la fonction.
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # Sortie: Hello, Alice!
greet(name="Alice", greeting="Hi") # Sortie: Hi, Alice!
# greet("Alice") # Erreur: TypeError
La fonction greet
accepte l'argument name
, qui ne peut être passé que
par nom. Les arguments
après *
peuvent être passés uniquement par nom.
Cette approche force à spécifier explicitement les noms des arguments, améliorant la lisibilité du code.
Combinaison d'arguments positionnels et nommés
Il est également possible de combiner des arguments positionnels et nommés pour atteindre une flexibilité maximale.
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Sortie: Hello, Alice!
greet("Alice", greeting="Hi") # Sortie: Hi, Alice!
# greet(name="Alice") # Erreur: TypeError
La fonction greet
accepte l'argument name
, qui ne peut être passé que par
position, et l'argument nommé greeting
, qui doit impérativement être
passé par nom. L'utilisation de /
et *
permet de combiner des arguments positionnels
et nommés.
Exemple complet des trois situations :
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# Appel de la fonction avec différents arguments
full_example(1, 2, 3, 4, e=5, f=6) # Tous les arguments sont passés correctement
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # Erreur: TypeError
Explication
-
Arguments uniquement positionnels:
a
etb
doivent être passés uniquement par position. -
Arguments ordinaires positionnels ou nommés:
c
etd
peuvent être passés tant par position que par nom. -
Arguments uniquement nommés:
e
etf
doivent être passés uniquement par nom.
GO TO FULL VERSION