2008-09-09 8 views
11

Decir que tengo los siguientes métodos:La transmisión de argumentos variable denominada en Python

def methodA(arg, **kwargs): 
    pass 

def methodB(arg, *args, **kwargs): 
    pass 

En MethodA deseo llamar methodB, la transmisión de los kwargs. Sin embargo, parece que si defino methodA de la siguiente manera, el segundo argumento se transmitirá como argumentos posicionales en lugar de variables nominales.

def methodA(arg, **kwargs): 
    methodB("argvalue", kwargs) 

¿Cómo asegurarse de que los kwargs ** en MethodA pasa como ** kwargs a methodB?

Respuesta

33

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 palabra clave.

methodB("argvalue", **kwargs) 
+0

No sé cuántas veces he tenido que buscar esta cosa, es tan simple y hasta ahora. Gracias por subirlo, aunque es obvio :) – cybertoast

1

alguna experimentación y pensé que éste hacia fuera:

def MethodA (arg, ** kwargs): methodB ("argvalue", ** kwargs)

Parece obvio ahora ...

2

Como acotación al margen: Al utilizar las funciones en lugar de métodos, también se puede utilizar functools.partial:

import functools 

def foo(arg, **kwargs): 
    ... 

bar = functools.partial(foo, "argvalue") 

La última línea definirá una "barra" función que, cuando se le llama, se llame foo con el primer argumento establecido en "argvalue" y todas las demás funciones acaba de pasar en:

bar(5, myarg="value") 

llamarán

foo("argvalue", 5, myarg="value") 

Lamentablemente, eso no funcionará con los métodos.

+0

¿Qué es lo que realmente hace? ¿Qué tiene que ver con la pregunta? – rjmunro

Cuestiones relacionadas