Pasar argumentos variables con nombre en Python
-
09-06-2019 - |
Pregunta
Digamos que tengo los siguientes métodos:
def methodA(arg, **kwargs):
pass
def methodB(arg, *args, **kwargs):
pass
En el métodoA deseo llamar al métodoB, pasando los kwargs.Sin embargo, parece que si defino methodA
de la siguiente manera, el segundo argumento se pasará como argumentos posicionales en lugar de variables con nombre.
def methodA(arg, **kwargs):
methodB("argvalue", kwargs)
¿Cómo me aseguro de que los **kwargs del métodoA se pasen como **kwargs al métodoB?
Solución
Coloque los asteriscos antes de la variable kwargs.Esto hace que Python pase la variable (que se supone que es un diccionario) como argumentos de palabras clave.
methodB("argvalue", **kwargs)
Otros consejos
Como un aparte:Cuando uses funciones en lugar de métodos, también puedes usar functools.partial:
import functools
def foo(arg, **kwargs):
...
bar = functools.partial(foo, "argvalue")
La última línea definirá una función "barra" que, cuando se llame, llamará a foo con el primer argumento establecido en "argvalue" y todas las demás funciones recién pasadas:
bar(5, myarg="value")
llamará
foo("argvalue", 5, myarg="value")
Lamentablemente, eso no funcionará con los métodos.
Un poco de experimentación y descubrí esto:
def métodoA(arg, **kwargs):métodoB("valorarg", **kwargs)
Parece obvio ahora...