Darò un esempio in cui ho utilizzato eval
e dove penso sia stata la scelta migliore.
Stavo scrivendo una semplice utility di test del software ... qualcosa per verificare se gli esercizi degli studenti fossero conformi ai requisiti di assegnazione.L'obiettivo era quello di fornire un modo per un semplice file di configurazione che servisse da specifica di test (per aggirare un problema di "gallina e uovo" dell'uso di un linguaggio di programmazione per descrivere/documentare/implementare i casi di test per assegnazioni elementari di programmazione) .
Ho basato il mio cablaggio su ConfigParser nelle librerie standard. Comunque, volevo che la capacità di rappresentare le stringhe Python arbitrarie (compresi interpolazioni di \ n, \ t, e caratteri ASCII soprattutto qualsiasi esagono interpolata codificata in valori letti da esso.
La mia soluzione era un try
intorno ad un parsed_string=eval('''%s''' % cfg_read_item)
seguito da a try
della versione a doppia virgola tripla ("" "% s" "")
Questo è un caso in cui l'alternativa sarebbe stata scrivere (o trovare un parser in linguaggio Python pre-scritto) e capire come includerlo e adattarlo al mio programma I rischi sono minimi (non sono preoccupato che il codice inviato dallo studente possa ingannare il mio parser, scoppiare se è in prigione, cancellare tutti i miei file, inviare i numeri della mia carta di credito in Romania e così via) *
* (In parte perché li stavo testando sotto Linux da un account utente headless non affidabile).
Come altri hanno già detto, ci sono altri casi di utilizzo in cui si sta costruendo codice da un modello basato su dati di input e occorre eseguire tale codice (meta programmazione). Dovresti sempre essere in grado di svolgere tali compiti in un altro modo. Tuttavia, ogni volta che quella alternativa comporta uno sforzo di codifica che si avvicina alla scrittura di un parser/compilatore/interprete di linguaggio di programmazione generale .... allora eval
potrebbe essere l'approccio migliore.
fonte
2010-11-11 19:25:16
Fatto: cose come 'eval' sono molto raramente una scelta valida, e solo se la stringa ad essa alimentata è nota per essere sicura. – delnan
Provate a cercarli nei file del codice sorgente Python nella libreria standard Python. Questo è sempre un punto di partenza interessante se vuoi vedere bene le funzionalità di base di Python. –
'exec' e' eval' possono essere molto utili in [codegolfing] (https://codegolf.stackexchange.com/). – Wrzlprmft