2009-12-18 9 views
9

Supongamos que tengo una cadena que representa algunas listas anidadas y quiero convertirla en algo real. Que podía hacer esto, pienso:¿Cómo analizo una cadena que representa una lista anidada en una lista real?

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

embargo, en un entorno donde los usuarios podrían estar suministrando la cadena para ejecutar este podría/sería una mala idea. ¿Alguien tiene alguna idea para un analizador ordenado que lograría lo mismo?

+0

+1 por conocer este tipo de cosas tiene riesgos y preguntas al respecto. –

Respuesta

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:

evaluar de forma segura un nodo de expresión o una cadena que contiene una expresión Python . La cadena o nodo proporcionado solo puede consistir en siguientes estructuras literales de Python: cadenas, números, tuplas, listas, dictados, booleanos y Ninguno.

Esto se puede utilizar para evaluar de forma segura cadenas que contengan expresiones Python de fuentes no fiables sin la necesidad para analizar los valores de uno mismo.

+0

+1 import ast haciendo las rondas, ¡buenas cosas! – jathanism

+0

Genial. La semana pasada usé eval() por primera vez, pero ast.literal_eval es lo que realmente quería. Tenga en cuenta que utilicé eval para analizar un valor de archivo de configuración, por lo que se trata de datos confiables, pero aún así ... – ddaa

Cuestiones relacionadas