Mentre la maggior parte delle risposte afferma che, ad esempio,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
equivale a"
def f(foo=None, bar=None, **kwargs):
...etc...
questo non è vero. In quest'ultimo caso, f
può essere chiamato come f(23, 42)
, mentre il primo caso accetta solo argomenti con nome - nessuna chiamata posizionale. Spesso si desidera consentire al chiamante la massima flessibilità e quindi è preferibile il secondo modulo, come affermano la maggior parte delle risposte: ma non è sempre così. Quando si accettano molti parametri opzionali di cui in genere vengono passati solo alcuni, può essere un'ottima idea (evitare incidenti e codice illeggibile nei siti di chiamata!) Per forzare l'uso di argomenti denominati - ne threading.Thread
è un esempio. Il primo modulo è il modo in cui lo implementi in Python 2.
Il linguaggio è così importante che in Python 3 ora ha una sintassi di supporto speciale: ogni argomento dopo un singolo *
nella def
firma è solo parola chiave, cioè non può essere passato come argomento posizionale, ma solo come un nome. Quindi in Python 3 puoi scrivere quanto sopra come:
def f(*, foo=None, bar=None, **kwargs):
...etc...
In effetti, in Python 3 puoi persino avere argomenti solo per parole chiave che non sono opzionali (quelli senza un valore predefinito).
Tuttavia, Python 2 ha ancora molti anni di vita produttiva, quindi è meglio non dimenticare le tecniche e gli idiomi che ti consentono di implementare in Python 2 importanti idee di design che sono direttamente supportate nel linguaggio in Python 3!