2009-12-18 4 views
9

Скажем, у меня есть строка, представляющая некоторые вложенные списки, и я хочу преобразовать ее в реальную вещь. Я мог бы сделать это, я думаю:Как обработать строку, представляющую вложенный список, в фактический список?

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

Но в среде, где пользователи могли бы поставлять строку, чтобы выполнить это может/будет плохой идеей. Есть ли у кого-нибудь идеи для аккуратного парсера, который бы выполнил то же самое?

+0

+1 Для того, чтобы знать, что это такое, есть риски и спрашивают об этом. –

ответ

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:

Безопасно оценить узел экспрессии или строку, содержащую выражение Python . Строка или узел могут состоять только из следующих строковых литералов Python: строки, числа, кортежи, списки, dicts, booleans и None.

Это может быть использован для безопасной оценки строк, содержащих Python выражений из ненадежных источников без необходимости разобрать значения себя.

+0

+1 import ast делает раунды, хорошие вещи! – jathanism

+0

Прохладный. Только на прошлой неделе я впервые использовал eval(), но ast.literal_eval - это то, что я действительно хотел. Заметьте, я использовал eval для анализа значения файла конфигурации, поэтому это надежные данные, но все же ... – ddaa