Преобразование строкового представления списка в фактический объект списка [duplicate]

На этот вопрос уже есть ответ:

Преобразовать строковое представление списка в список 14 ответов

У меня есть строка, которая выглядит идентично списку, скажем:

fruits = "['apple', 'orange', 'banana']"

Как бы это можно было преобразовать в объект списка?

Ответы на вопрос(3)

Решение Вопроса
>>> fruits = "['apple', 'orange', 'banana']"
>>> import ast
>>> fruits = ast.literal_eval(fruits)
>>> fruits
['apple', 'orange', 'banana']
>>> fruits[1]
'orange'

Ast.literal_eval являетсясей. Из документов:

Safely оцените узел выражения или строку, содержащую выражение Python. Предоставленная строка или узел может состоять только из следующих литеральных структур Python: строк, чисел, кортежей, списков, слов, логических значений и None.

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

 Arka27 мая 2012 г., 19:31
Заметк: это не работает, если вы вызываете функцию внутри массива (или любого другого типа, кроме строк, чисел, кортежей, списков, слов, логических значений и None). Для этих случаев вы можете использоватьeval.
 Boud27 мая 2012 г., 19:39
Примечание на заметку:ast.literal_eval успешен только для литералов и ничего больше. Это защищает ваша программа от внедрения кода, например"['apple', 'orange', 'banana'];import os;os.remove('a_file')" потерпит неудачу сliteral_eval
 Muhammad Taqi10 сент. 2015 г., 08:41
У меня тоже есть такая же проблема, но мой список строк такой:fruits = "['apple', 'orange', 'banan'a']" как бы вы справились с запятой междуbanana а такжеa.
 TheExorcist26 дек. 2016 г., 12:17
Избавил меня от работы со строками.

Простой вызовeval() Сделаю

fruits = eval("['apple', 'orange', 'banana']")
fruits
> ['apple', 'orange', 'banana']

Или как объяснено в этомстать, то же самое можно сделать чуть более безопасно (то есть без риска непреднамеренных побочных эффектов или внедрения вредоносного кода), например:

fruits = eval("['apple', 'orange', 'banana']", {'__builtins__':None}, {})

Это решение имеет то преимущество, что не зависит от дополнительных модулей.

 Óscar López27 мая 2012 г., 19:37
@ mgilson спасибо за совет, я обновил свой ответ
 mgilson27 мая 2012 г., 19:34
Это достигается немного безопаснее с помощьюeval(frtstring,{__builtins__:None},{})
 Gareth Latty27 мая 2012 г., 19:48
-1 Нет смысла использоватьeval() Вот.ast.literal_eval() сделает работу намного лучше и безопаснее.
 mgilson28 мая 2012 г., 15:47
В то время какast.literal_eval лучше для этого,eval работает (и это полезно время от времени, поэтому о нем стоит знать). Я не вижу смысла понижать его, поскольку он делает то, что задал вопрос (+1 от меня).
 Martijn Pieters♦05 нояб. 2014 г., 09:40
@ mgilson: использование @ имеет серьезные последствия для безопасносeval(), что даже{'__builtins__': None} не собирается вас спасать.

Ваш ответ на вопрос