Преобразование строкового представления списка в фактический объект списка
У меня есть строка, которая похожа на список, скажем:
fruits = "['apple', 'orange', 'banana']"
Каким образом можно преобразовать это в объект списка?
Ответы
Ответ 1
>>> fruits = "['apple', 'orange', 'banana']"
>>> import ast
>>> fruits = ast.literal_eval(fruits)
>>> fruits
['apple', 'orange', 'banana']
>>> fruits[1]
'orange'
Как указано в комментариях ast.literal_eval безопасно. Из документов:
Безопасно оценить выражение node или строку, содержащую Python выражение. Строка или node предоставляется может состоять только из следующие литеральные структуры Python: строки, числа, кортежи, списки, dicts, booleans и None.
Это можно использовать для безопасной оценки строк, содержащих Python выражения из ненадежных источников без необходимости разбирать ценит себя.
Ответ 2
Простой вызов eval()
будет выполнять:
fruits = eval("['apple', 'orange', 'banana']")
fruits
> ['apple', 'orange', 'banana']
Или, как описано в статье то же самое можно сделать более безопасно (это означает: без риска непреднамеренных побочных эффектов или вредоносного кода инъекции) следующим образом:
fruits = eval("['apple', 'orange', 'banana']", {'__builtins__':None}, {})
Это решение имеет то преимущество, что оно не зависит от дополнительных модулей.
Ответ 3
Я думаю, для этого и предназначен ast.literal_eval.
(http://docs.python.org/library/ast.html#ast.literal_eval)