2009-12-18 14 views
9

Dire che ho una stringa che rappresenta alcune liste annidate e voglio convertirla nella cosa reale. Ho potuto fare questo, penso:Come analizzare una stringa che rappresenta un elenco annidato in un elenco effettivo?

exec "myList = ['foo', ['cat', ['ant', 'bee'], 'dog'], 'bar', 'baz']" 

Ma in un ambiente in cui gli utenti potrebbero essere fornendo la stringa per eseguire questo potrebbe/sarebbe una cattiva idea. Qualcuno ha qualche idea per un parser ordinato che realizzerebbe la stessa cosa?

+0

+1 per sapere che questo genere di cose ha dei rischi e chiede informazioni al riguardo. –

risposta

21
>>> import ast 
>>> mylist = ast.literal_eval("['foo', ['cat', ['ant', 'bee'], 'dog'], 'bar', 'baz']") 
>>> mylist 
['foo', ['cat', ['ant', 'bee'], 'dog'], 'bar', 'baz'] 

ast.literal_eval:

sicura valutare un nodo espressione o una stringa contenente un'espressione Python . La stringa o il nodo fornito può consistere solo di seguenti strutture letterali Python: stringhe, numeri, tuple, elenchi, dicts, booleans e None.

questo può essere usato per valutare in modo sicuro stringhe contenenti Python espressioni da fonti non attendibili, senza la necessità di analizzare i valori stessi.

+0

+1 importazione ast facendo il giro, roba buona! – jathanism

+0

Freddo. Proprio la settimana scorsa ho usato eval() per la prima volta, ma ast.literal_eval è quello che volevo davvero. Nota, ho usato eval per analizzare un valore del file di configurazione, quindi sono dati attendibili, ma comunque ... – ddaa

Problemi correlati