2012-07-28 18 views
5

Tengo un módulo que importo a mi aplicación principal llamado pageprocs.py con una colección de funciones que generan contenido diferente y lo devuelven en una cadena. Se supone que pageprocs es una forma de permitir que los usuarios autenticados creen complementos para el tipo de contenido diferente.Funciones de proceso de una lista de cadenas en Python

Luego tengo una lista de cadenas: ['check_stats', 'build_table', 'build_ace'] que son los nombres de algunas funciones en pageprocs. Necesito ejecutar las funciones en el orden en que están en la lista y no pueden encontrar una manera de hacer esto sin usar exec():

for i in list_of_funcs: 
    exec('pageprocs.%s()' % i) 

Esto sólo parece una mala idea en serio a mí y no es fácil para atrapar cualquier excepción en el código de los usuarios. ¿Existe alguna alternativa para ejecutar el código de esta manera o alguien tiene sugerencias sobre la generación de contenido definido por el usuario (lo pregunto porque tal vez me estoy equivocando al abordar toda la situación).

+1

donde obtienes 'list_of_funcs'? ¿Por qué no almacena funciones en él directamente? – jfs

+0

list_of_funcs se crea leyendo variables ubicadas en un archivo de plantilla para que los usuarios conozcan las áreas de la plantilla que necesitan contenido. El archivo de la plantilla se lee como una cadena durante la creación del contenido, por lo que los nombres de las funciones también se almacenan como una cadena. –

Respuesta

11
for i in list_of_stats: 
    getattr(pageprocs, i, lambda: None)() 

lambda: None La parte es opcional, pero evitará que se crían AttributeError si la función especificada no existe (que es una función que no hace nada anónimo).

+2

Desearía tener la reputación de modificar esto. Muy limpio y funciona. –

+0

+1 Aunque como una cuestión de estilo personal no me gusta el null invocable y preferiría 'if hasattr (pageprocs, i): getattr (pageprocs, i)()' o incluso 'func = getattr (pageprocs, i) ; if invocable (func): func() ' – kojiro

+0

Al principio pensé que querías' TypeError', que es lo que esperarías si intentas llamar 'None()', pero si 'i' simplemente no es parte de 'pageprocs' obtendrías' AttributeError', no 'NameError'. A menos que lo haya entendido mal ... – kojiro

Cuestiones relacionadas