argumentos de palabras clave de Python
-
02-10-2019 - |
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í?
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.