2009-12-18 5 views
9

Dites que j'ai une chaîne représentant des listes imbriquées et que je veux la convertir en réalité. Je pouvais le faire, je pense:Comment analyser une chaîne représentant une liste imbriquée dans une liste réelle?

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

Mais dans un environnement où les utilisateurs pourraient être la chaîne à fournissent exécuter ce pourrait/serait une mauvaise idée. Est-ce que quelqu'un a des idées pour un parser bien rangé qui accomplirait la même chose?

+0

+1 pour savoir que ce genre de chose comporte des risques et pose des questions à ce sujet. –

Répondre

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:

évaluer en toute sécurité un noeud d'expression ou une chaîne contenant une expression Python . La chaîne ou le noeud fourni ne peut contenir que les structures littérales Python suivantes: : chaînes, nombres, tuples, listes, dicts, booléens et None.

Cela peut être utilisé pour évaluer en toute sécurité chaînes contenant des expressions Python à partir de sources non fiables, sans la nécessité d'analyser les valeurs soi-même.

+0

+1 import ast faire les rondes, bonnes choses! – jathanism

+0

Cool. La semaine dernière, j'ai utilisé eval() pour la première fois, mais ast.literal_eval est ce que je voulais vraiment. Note, j'ai utilisé eval pour analyser une valeur de fichier de configuration, donc ce sont des données de confiance, mais quand même ... – ddaa

Questions connexes