2011-03-22 13 views
7

Lo que necesito hacer es recorrer una gran cantidad de archivos diferentes y (intentar) recuperar los metadatos de los archivos.Ejecutar una función por nombre de variable en Python

Puedo hacer un gran if ... elif ... y probar cada extensión, pero creo que sería mucho más fácil almacenar la extensión en una variable, verificar si existe una función con ese nombre, y ejecutar eso.

Ésta es mi solución actual, tomada desde otro hilo StackOverflow:

try: 
    getattr(modulename, funcname)(arg) 
except AttributeError: 
    print 'function not found "%s" (%s)' % (funcname, arg) 

Hay un problema con esto: Si la función subyacente plantea una AttributeError, esto está registrada como una "función no encontrado" de error . puedo añadir bloques try ... except a todas las funciones, pero eso no sería particularmente bastante bien ...

Lo que estoy buscando es más algo como:

if function_exists(fun): 
    execute_function(fun, arg) 

¿Existe una forma directa de hacer esto?

Gracias :-)

Respuesta

22

que puede hacer:

func = getattr(modulename, funcname, None): 
if func: 
    func(arg) 

O tal vez mejor:

try: 
    func = getattr(modulename, funcname) 
except AttributeError: 
    print 'function not found "%s" (%s)' % (funcname, arg) 
else: 
    func(arg) 
+1

me gustaría envolver 'func (arg)' 'en un Proveedores:' TypeError y la captura en caso de que el módulo tiene un atributo 'func' que no es invocable – geoffspear

+0

@Wooble: buena sugerencia o también puede hacer: 'if func and invocable (func):' – mouad

+0

@Carpetsmoker: me alegro de que ayude :) – mouad

3

El gettattr function tiene un tercer argumento opcional para un valor por defecto para volver si el atributo no existe, por lo que podría utilizar lo siguiente:

fun = getattr(modulename, funcname, None) 

if fun is None: 
    print 'function not found "%s" (%s)' % (funcname, arg) 
else 
    fun(arg) 
0

Al igual que @mouad dijo, callable(function) puede llamar a una función.

Usted puede usar esto para llamar a una función desde el interior de una variable usando la siguiente:

callable(SAVE()) 

Esto llamará a la función que se especifica como la arg.

Para utilizar esta dentro de una variable:

Save = callable(SAVE()) 
Cuestiones relacionadas