per Python versioni < 3.5, è necessario inserire l'argomento parola chiave **kwargs
ultimo:
f(c=3, **pre_defined_kwargs)
Vedere Calls expression syntax; in tutte le forme della grammatica viene applicata la regola "**" expression
nell'ultimo. In altre parole, l'utilizzo di qualsiasi cosa dopo la sintassi **expression
è un errore di sintassi.
Se si desidera aggiornare il dizionario con nuovi valori, è possibile utilizzare dict()
callable; è possibile creare una copia del dizionario esistente e chiavi di aggiornamento in che, a condizione che le chiavi sono anche identificatori validi Python (iniziare con una lettera o di sottolineatura e contenere solo lettere, cifre e underscore):
f(c=3, **dict(pre_defined_kwargs, b=42))
Qui b=42
imposta un valore nuovo per la chiave 'b'
. Questa stessa sintassi può essere utilizzata anche per aggiungere chiavi, ovviamente.
Non è possibile utilizzare la stessa chiave nella mappatura **expression
e in modo esplicito; che aumenterà un TypeError
. Anche in questo caso, dalla documentazione già collegati:
Se la sintassi **expression
appare nella chiamata di funzione, expression
deve restituire una mappatura, i cui contenuti sono trattati come argomenti chiave aggiuntivi. Nel caso in cui una parola chiave compaia sia in expression
sia come argomento di parole chiave esplicite, viene sollevata un'eccezione TypeError
.
Demo:
>>> def f(**kwargs):
... print(kwargs)
...
>>> pre_defined_kwargs = {'a': 1, 'b': 2}
>>> f(c=3, **pre_defined_kwargs)
{'a': 1, 'c': 3, 'b': 2}
>>> dict(pre_defined_kwargs, b=42)
{'a': 1, 'b': 42}
>>> f(c=3, **dict(pre_defined_kwargs, b=42))
{'a': 1, 'c': 3, 'b': 42}
Questa restrizione è stata eliminata a partire da Python 3.5 (grazie a PEP-448 -- Additional Unpacking Generalizations; ora è possibile mescolare liberamente l'ordine dei tipi di argomento e di uso multiplo **mapping
riferimenti a una chiamata (utilizzando distinti le parole chiave devono ancora essere univoche tra tutti gli argomenti applicati, non è ancora possibile eseguire l'override degli argomenti che appaiono più di una volta.
metti 'c = 3' prima?' f (c = 3, ** pre_defined_kw) ' –
perché dovresti sostituire b e non solo usare' ** pre_defined_kw' o r cambia 'pre_defined_kwargs' –