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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top