2011-04-04 9 views
8

¿Cómo llamo a una función y solo le paso los argumentos que espera? Por ejemplo decir que tengo las siguientes funciones:Llamar a una función en Python y pasar solo los argumentos que espera

func1 = lambda a: True 
func2 = lambda a, b: True 
func3 = lambda c: True 

Quiero un poco de código Python que es capaz de llamar con éxito estas funciones sin levantar un TypeError por el paso de argumentos inesperados. es decir,

kwargs = dict(a=1, b=2, c=3) 
for func in (func1, func2, func3): 
    func(**kwargs) # some magic here 

No estoy interesado en sólo añadir **kwargs a las funciones cuando los definen.

+0

Use 'try-catch'? –

+2

@BlaXpirit ... y fuerza bruta todas las combinaciones de argumentos? –

Respuesta

10

Puede utilizar inspect.getargspec():

from inspect import getargspec 
kwargs = dict(a=1, b=2, c=3) 
for func in (func1, func2, func3): 
    func(**dict((name, kwargs[name]) for name in getargspec(func)[0])) 
+3

Tenga en cuenta que está en desuso desde 3.0. Use getfullargspec() en su lugar, que proporciona información sobre argumentos y anotaciones de palabras clave. pero getfullargspec() no está disponible en 2.7 y menor –

4

Bueno, dependiendo exactamente de lo que quieras hacer con argumentos variables y argumentos de palabras clave, el resultado será un poco diferente, pero es probable que quieras comenzar con inspect.getargspec(func).

Cuestiones relacionadas