Преобразуйте строку listcomp в listcomp с помощью literal_eval

#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)