argomenti Python parola chiave
-
02-10-2019 - |
Domanda
Ho diversi strati di chiamate di funzione, passando attorno a un dizionario comune di argomenti chiave di parole:
def func1(**qwargs):
func2(**qwargs)
func3(**qwargs)
vorrei fornire alcuni argomenti di default in alcune delle successive chiamate di funzione, qualcosa di simile a questo:
def func1(**qwargs):
func2(arg = qwargs.get("arg", default), **qwargs)
func3(**qwargs)
Il problema di questo approccio è che se arg è qwargs all'interno, un TypeError viene sollevata con "ha ottenuto più valori per argomento chiave".
Non voglio qwargs set [ "arg"] per impostazione predefinita, perché poi FUNC3 ottiene questo argomento senza mandato. Potrei fare un copy.copy dei qwargs e impostare "arg" nella copia, ma qwargs potuto avere grandi strutture di dati in essa e non voglio copiare loro (forse copy.copy non sarebbe, solo copy.deepcopy ?).
Qual è la cosa divinatorio di fare qui?
Soluzione
solo costruire e utilizzare un altro dict al fine di chiamare func2
, lasciando il solo originale per la chiamata successiva a func3
:
def func1(**qwargs):
d = dict(arg=default)
d.update(qwqargs)
func2(**d)
func3(**qwargs)
Questo è se si vuole un'impostazione per arg
in qwargs
per ignorare il default
. In caso contrario (se si vuole default
di ignorare qualsiasi ambiente possibile per arg
in qwargs
):
def func1(**qwargs):
d = dict(qwargs, arg=default)
func2(**d)
func3(**qwargs)
dal momento che la parola-argomento dict
sostituisce il valore nell'argomento posizionale, se del caso.
Altri suggerimenti
Per creare una nuova dict con le stesse chiavi e valori è possibile utilizzare
newdict=dict(qwargs)
Se qwargs non contiene in realtà molte chiavi che è a buon mercato.
Se è possibile, si potrebbe riscrivere le funzioni a prendere i loro argomenti davvero così dict invece di più args.