В чем разница между 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 предназначен для выполнения выражений и возвращает значение этого выражения.
В этом контексте "выражение" означает "что-то", тогда как "оператор" подразумевает "сделать что-то".
Python: как получить вывод print в выражении exec
Динамическое создание методов (генерация кода) в Python на этапе выполнения
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?