et permettent à une fonction d'accepter un d'arguments. collecte les arguments supplémentaires dans un tuple ; collecte les arguments supplémentaires dans un dict. (Les noms sont une convention — et sont ce qui compte.)
et permettent à une fonction d'accepter un d'arguments. collecte les arguments supplémentaires dans un tuple ; collecte les arguments supplémentaires dans un dict. (Les noms sont une convention — et sont ce qui compte.)
*args**kwargs*args**kwargs***def total(*args): # collects all positional args into a tuple
print(args) # e.g. (1, 2, 3)
return sum(args)
total(1, 2, 3) # 6
total(1, 2, 3, 4, 5) # 15 — any number of args
def configure(**kwargs): # collects keyword args into a dict
print(kwargs) # e.g. {"host": "localhost", "port": 8080}
for key, value in kwargs.items():
print(f"{key} = {value}")
configure(host="localhost", port=8080, debug=True)
def func(a, b, *args, **kwargs):
# a, b → required positional
# args → extra positional (tuple)
# kwargs → extra keyword (dict)
...
func(1, 2, 3, 4, x=5, y=6)
# a=1, b=2, args=(3, 4), kwargs={"x": 5, "y": 6}
L'ordre requis est : paramètres réguliers, puis *args, puis **kwargs.
# `*` and `**` also UNPACK collections INTO arguments at the call site
numbers = [1, 2, 3]
total(*numbers) # same as total(1, 2, 3)
settings = {"host": "x", "port": 80}
configure(**settings) # same as configure(host="x", port=80)
La même syntaxe déplie une liste/un dict en arguments positionnels/nommés — pratique pour transférer des arguments.
def wrapper(*args, **kwargs):
# accept ANY arguments and pass them through unchanged
return original_func(*args, **kwargs)
Ce modèle de transfert est la façon dont les décorateurs et les fonctions wrapper gèrent n'importe quelle signature de fonction via *args, **kwargs.
*args/**kwargs permettent des signatures de fonction flexibles qui acceptent n'importe quel nombre d'arguments — essentiels pour écrire des utilitaires d'usage général, des wrappers et particulièrement des décorateurs (qui doivent envelopper des fonctions de signatures inconnues via *args, **kwargs).
La direction de dépliage (*list, **dict) est tout aussi utile pour transférer ou étendre des arguments.
Comprendre à la fois la collecte et le dépliage est la clé pour écrire du code Python réutilisable et générique et pour lire les nombreuses API de bibliothèque et décorateurs qui s'appuient sur ces fonctionnalités.
Une bibliothèque de questions d'entretien IT avec des réponses détaillées — du Junior au Senior.
Faire un don