#python #string #type-conversion #list-comprehension
Вопрос:
Я пытаюсь преобразовать строку понимания списка (пользовательский ввод) в фактическое понимание списка. Я использую literal_eval из AST.
fruits = ['apple', 'orange']
l1 = '[ele for ele in fruits]'
l2 = literal_eval(l1)
print(l2, type(l2))
Это будет работать, если l1 является строкой списка, но не если это строка listcomp. Если я использую только eval (), я получаю список после понимания [«яблоко», «апельсин»]. Я надеялся получить [ele за ele во фруктах] в качестве класса .
Комментарии:
1. Ты не можешь сделать это с
literal_eval()
помощью . Как следует из названия, это только для оценки литералов . Понимание списка не является буквальным.2. «Listcomp» не является объектом и не является литералом объекта, поэтому
literal_eval
не будет работать по замыслу . Использоватьeval
?
Ответ №1:
Python и, вообще говоря, подобные ему языки можно рассматривать как имеющие два режима анализа и выполнения. Если вы находитесь в режиме выполнения (ваш исходный код был проанализирован), вам eval
необходимо вернуться в режим анализа. Это говорит ему, что то, что он ранее считал строкой, является особенным и что это код.
Вы правы , чтобы за eval
, но вы просто eval
не хотите literal_eval
>>> a = [1,2,3,42]
>>> code = "[x for x in a if x > 2]"
>>> eval(code)