2012-07-28 6 views
5

Ho un modulo che importa nella mia applicazione principale denominata pageprocs.py con una serie di funzioni al suo interno che generano contenuto diverso e lo restituiscono in una stringa. pageprocs dovrebbe essere un modo per consentire agli utenti autenticati di creare plugin per il diverso tipo di contenuto.Funzioni di processo da un elenco di stringhe in Python

Ho quindi un elenco di stringhe: ['check_stats', 'build_table', 'build_ace'], che sono i nomi di alcune funzioni in pageprocs. Ho bisogno di eseguire le funzioni nell'ordine in cui sono nella lista e non riesce a trovare un modo di fare questo senza usare exec():

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

Questo solo sembra una cattiva idea sul serio a me e non facile per rilevare eventuali eccezioni nel codice degli utenti. Esiste un'alternativa al codice in esecuzione in questo modo o qualcuno ha suggerimenti sulla generazione di contenuti definiti dall'utente (lo chiedo perché forse mi sto avvicinando a tutta la situazione).

+1

dove ottieni 'list_of_funcs'? Perché non si memorizzano le funzioni direttamente? – jfs

+0

list_of_funcs viene creato leggendo le variabili inserite in un file modello in modo che gli utenti siano a conoscenza delle aree del modello che necessitano di contenuto. Il file modello viene letto come una stringa durante la creazione del contenuto in modo che anche i nomi delle funzioni vengano memorizzati come stringa. –

risposta

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

La parte lambda: None è facoltativo, ma impedirà AttributeError essere sollevato se la funzione specificata non esiste (è una funzione di do-nothing anonimo).

+2

Vorrei avere la reputazione di modificare questo. Molto pulito e funziona. –

+0

+1 Anche se per stile personale non mi piace il null callable e preferirei se hasattr (pageprocs, i): getattr (pageprocs, i)() 'o anche' func = getattr (pageprocs, i) ; se callable (func): func() ' – kojiro

+0

All'inizio pensavo volesse dire TypeError', che è quello che ci si aspetterebbe di ottenere se si prova a chiamare' None() ', ma se' i' semplicemente non fa parte di 'pageprocs' otterresti un' AttributeError', non un 'NameError'. A meno che non abbia frainteso ... – kojiro