και επιτρέπουν σε μια συνάρτηση να δεχθεί έναν ορισμάτων. συλλέγει επιπλέον ορίσματα σε ένα tuple; συλλέγει επιπλέον ορίσματα σε ένα dict. (Τα ονόματα είναι σύμβαση — το και το είναι αυτό που έχει σημασία.)
και επιτρέπουν σε μια συνάρτηση να δεχθεί έναν ορισμάτων. συλλέγει επιπλέον ορίσματα σε ένα tuple; συλλέγει επιπλέον ορίσματα σε ένα dict. (Τα ονόματα είναι σύμβαση — το και το είναι αυτό που έχει σημασία.)
*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}
Η απαιτούμενη σειρά είναι: κανονικές παράμετροι, μετά *args, μετά **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)
Η ίδια σύνταξη αποσυνδέει μια λίστα/dict σε ορίσματα θέσης/λέξης-κλειδί — χρήσιμο για προώθηση ορισμάτων.
def wrapper(*args, **kwargs):
# accept ANY arguments and pass them through unchanged
return original_func(*args, **kwargs)
Αυτό το μοτίβο διέλευσης είναι ο τρόπος με τον οποίο οι διακοσμητές και οι συναρτήσεις αναδύσεων χειρίζονται οποιαδήποτε υπογραφή συνάρτησης μέσω *args, **kwargs.
*args/**kwargs ενεργοποιούν ευέλικτες υπογραφές συναρτήσεων που δεχονται οποιονδήποτε αριθμό ορισμάτων — απαραίτητα για τη συγγραφή γενικών εργαλείων, αναδύσεων και ιδιαίτερα διακοσμητών (που πρέπει να περιβάλλουν συναρτήσεις με άγνωστες υπογραφές μέσω *args, **kwargs).
Η κατεύθυνση αποσύνδεσης (*list, **dict) είναι εξίσου χρήσιμη για προώθηση ή διάχυση ορισμάτων.
Η κατανόηση τόσο της συλλογής όσο και της αποσύνδεσης είναι το κλειδί για τη συγγραφή επαναχρησιμοποιήσιμου, γενικού κώδικα Python και για την ανάγνωση των πολλών API βιβλιοθήκης και διακοσμητών που βασίζονται σε αυτές τις δυνατότητες.