2015-01-11 16 views
9

C'è un modo per aggiungere coppia chiave-valore in kwargs durante la chiamata di funzione?Aggiungere un parametro in kwargs durante la chiamata di funzione?

def f(**kwargs): 
    print(kwargs) 

# ... 

pre_defined_kwargs = {'a': 1, 'b': 2} 

f(**pre_defined_kwargs, c=3) 

Oppure modificare gli argomenti esistenti?

f(**pre_defined_kwargs, b=3) # replaces the earlier b=2 

Questi due esempi non funzionano, come si sollevano errore

>>> f(**pre_defined_kwargs, c=3) 
SyntaxError: invalid syntax 

Indicando la virgola tra gli argomenti

+1

metti 'c = 3' prima?' f (c = 3, ** pre_defined_kw) ' –

+0

perché dovresti sostituire b e non solo usare' ** pre_defined_kw' o r cambia 'pre_defined_kwargs' –

risposta

17

per Python versioni < 3.5, è necessario inserire l'argomento parola chiave **kwargsultimo:

f(c=3, **pre_defined_kwargs) 

Vedere Calls expression syntax; in tutte le forme della grammatica viene applicata la regola "**" expressionnell'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.

2
>>> f(c=3, **pre_defined_kwargs) 
{'c': 3, 'a': 1, 'b': 2} 
+2

@MarkusMeskanen, prova' f (** dict (pre_defined_kwargs, b = 22)) '. –

Problemi correlati