CodeGym /Cours /Python SELF FR /Travail avancé avec les paramètres de fonction

Travail avancé avec les paramètres de fonction

Python SELF FR
Niveau 14 , Leçon 3
Disponible

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 et b doivent être passés uniquement par position.
  • Arguments ordinaires positionnels ou nommés: c et d peuvent être passés tant par position que par nom.
  • Arguments uniquement nommés: e et f doivent être passés uniquement par nom.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION