2012-08-02 8 views
9

Estoy usando getattr para llamar a diferentes funciones dependiendo de una variable.Python usando getattr para llamar a la función con parámetros variables

que estoy haciendo algo por el estilo:

getattr(foo, bar)() 

que funciona, llamar a funciones como foo.bar()

Mi problema es que tengo las funciones de 'bar' y quiero llamarlo con diferentes parámetros. Por ejemplo:

def f1() : 
    pass 

def f2(param1) : 
    pass 

def f3(param1,param2) : 
    pass 

modo 'barra' podría ser F1, F2 o F3

He intentado esto: assumming que params es una lista que contiene todos los parámetros necesarios para la función de 'bar'

getattr(foo, bar) (for p in params :) 

que ver para una solución "limpia", sin necesaria para observar la longitud de los parametros variables

Respuesta

16

usted podría intentar algo como:

getattr(foo, bar)(*params) 

Esto funciona si params es una lista o una tupla. Los elementos de params se descomprime en orden:

params=(1, 2) 
foo(*params) 

es equivalente a:

params=(1, 2) 
foo(params[0], params[1]) 

Si hay argumentos de palabras clave, usted puede hacer eso también.

getattr(foo, bar)(*params, **keyword_params) 

donde keyword_params es un diccionario.

Además, Esta respuesta es realmente independiente de getattr. Funcionará para cualquier función/método.

+2

Sé que OP no me preguntó específicamente, pero yo agregaría '** kwargs' también, para que no termine con la tarea de rastrear errores más adelante si intentara usar argumentos de palabra clave. –

+0

@ sr2222 - Agregado. – mgilson

Cuestiones relacionadas