В чем разница между eval, exec и compile?
У меня возникла необходимость динамической оценки кода на Python, и я столкнулся с функциями eval()
и compile()
, а также с оператором exec
.
Не могли бы вы объяснить разницу между eval
и exec
, а также какое отношение имеют различные режимы функции compile()
к этим двум?
2 ответ(ов)
Ответ на вопрос о exec
, eval
и compile
в Python
exec
— это не выражение: в Python 2.x это оператор, а в Python 3.x — функция. Она компилирует и сразу же выполняет оператор или набор операторов, содержащихся в строке. Пример:exec('print(5)') # выводит 5. # exec 'print 5' — если вы используете Python 2.x, здесь ни exec, ни print не являются функциями exec('print(5)\nprint(6)') # выводит 5{перенос строки}6. exec('if True: print(6)') # выводит 6. exec('5') # ничего не делает и не возвращает ничего.
eval
— это встроенная функция (не оператор), которая оценивает выражение и возвращает значение, которое это выражение производит. Пример:x = eval('5') # x <- 5 x = eval('%d + 6' % x) # x <- 11 x = eval('abs(%d)' % -100) # x <- 100 x = eval('x = 5') # НЕКОРРЕКТНО; присваивание не является выражением. x = eval('if 1: x = 4') # НЕКОРРЕКТНО; if — это оператор, а не выражение.
compile
— это низкоуровневая версияexec
иeval
. Она не выполняет ваши операторы или выражения, а возвращает объект кода, который может это сделать. Режимы следующие:compile(string, '', 'eval')
возвращает объект кода, который был бы выполнен, если бы вы использовалиeval(string)
. Обратите внимание, что в этом режиме вы не можете использовать операторы; только (единичное) выражение допустимо.compile(string, '', 'exec')
возвращает объект кода, который был бы выполнен, если бы вы использовалиexec(string)
. Здесь можно использовать любое количество операторов.compile(string, '', 'single')
аналогичен режимуexec
, но ожидает ровно одно выражение/оператор, например,compile('a=1 if 1 else 3', 'myf', mode='single')
.
exec
используется для выполнения операторов и не возвращает никаких значений. В свою очередь, eval
предназначен для выполнения выражений и возвращает значение этого выражения.
В этом контексте "выражение" означает "что-то", тогда как "оператор" подразумевает "сделать что-то".
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Преобразование списка словарей в DataFrame pandas
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Как явно освободить память в Python?
Выбор строки из pandas Series/DataFrame по целочисленному индексу