5

В чем разница между eval, exec и compile?

16

У меня возникла необходимость динамической оценки кода на Python, и я столкнулся с функциями eval() и compile(), а также с оператором exec.

Не могли бы вы объяснить разницу между eval и exec, а также какое отношение имеют различные режимы функции compile() к этим двум?

2 ответ(ов)

2

Ответ на вопрос о exec, eval и compile в Python

  1. 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')                 # ничего не делает и не возвращает ничего.
    
  2. 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 — это оператор, а не выражение.
    
  3. compile — это низкоуровневая версия exec и eval. Она не выполняет ваши операторы или выражения, а возвращает объект кода, который может это сделать. Режимы следующие:

  4. compile(string, '', 'eval') возвращает объект кода, который был бы выполнен, если бы вы использовали eval(string). Обратите внимание, что в этом режиме вы не можете использовать операторы; только (единичное) выражение допустимо.

  5. compile(string, '', 'exec') возвращает объект кода, который был бы выполнен, если бы вы использовали exec(string). Здесь можно использовать любое количество операторов.

  6. compile(string, '', 'single') аналогичен режиму exec, но ожидает ровно одно выражение/оператор, например, compile('a=1 if 1 else 3', 'myf', mode='single').

0

exec используется для выполнения операторов и не возвращает никаких значений. В свою очередь, eval предназначен для выполнения выражений и возвращает значение этого выражения.

В этом контексте "выражение" означает "что-то", тогда как "оператор" подразумевает "сделать что-то".

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь