Pregunta

Tengo varias capas de llamadas a funciones, que pasa alrededor de un diccionario común de los argumentos de palabras clave:

def func1(**qwargs):
    func2(**qwargs)
    func3(**qwargs)

Me gustaría suministrar algunos argumentos por defecto en algunas de las llamadas a funciones posteriores, algo como esto:

def func1(**qwargs):
    func2(arg = qwargs.get("arg", default), **qwargs)
    func3(**qwargs)

El problema con este enfoque es que si arg es qwargs interior, un TypeError se eleva con "consiguió varios valores para argumento de palabra clave".

No quiero a qwargs conjunto [ "arg"] a los valores, porque entonces func3 obtiene este argumento sin orden judicial. Yo podría hacer una copy.copy de los qwargs y ajuste "arg" en la copia, pero qwargs podría tener grandes estructuras de datos en ella y no quiere copiarlos (tal vez copy.copy no sólo copy.deepcopy ?).

¿Qué es lo Pythonic a hacer aquí?

¿Fue útil?

Solución

Sólo construir y utilizar otro dict con el propósito de llamar func2, dejando el solo original para la llamada más tarde a func3:

def func1(**qwargs):
    d = dict(arg=default)
    d.update(qwqargs)
    func2(**d)
    func3(**qwargs)

Esto es, si quieres un entorno de arg en qwargs para anular el default. En caso contrario (si quieres default para anular cualquier escenario posible para arg en qwargs):

def func1(**qwargs):
    d = dict(qwargs, arg=default)
    func2(**d)
    func3(**qwargs)

ya que la palabra clave-argumento para dict anula el valor en el argumento posicional, en su caso.

Otros consejos

Para crear un nuevo dict con las mismas claves y valores que se pueden utilizar

 newdict=dict(qwargs)

Si qwargs no contiene realmente muchas teclas que es barato.

Si es posible que usted podría reescribir las funciones a llevar sus argumentos realmente tan dict en lugar de múltiples argumentos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top