eval exec cpmpile 的区别

参考:

eval 用来执行单条语句,而 exec 用来动态执行一段 Python 代码的边际效应。

eval 和 exec 的区别:

  • eval 接受单条语句,exec 可以接受多条语句,可以包括循环,函数定义等等
  • eval 返回值而 exec 忽略返回值,永远返回 None
>>> a = 5
>>> eval('37 + a')   # it is an expression
42
>>> exec('37 + a')   # it is an expression statement; value is ignored (None is returned)
>>> exec('a = 47')   # modify a global variable as a side effect
>>> a
47
>>> eval('a = 47')  # you cannot evaluate a statement
  File "<string>", line 1
    a = 47
      ^
SyntaxError: invalid syntax

exec 模式的 compile 把代码编译为永远返回 None 的 bytecode,而 eval 模式则会返回值。

>>> eval(compile('42', '<string>', 'exec'))  # code returns None
>>> eval(compile('42', '<string>', 'eval'))  # code returns 42
42
>>> exec(compile('42', '<string>', 'eval'))  # code returns 42,
>>>                                          # but ignored by exec

如果给 eval 传入的不是单条语句会报错,实际上这样的差异是应为 eval 和 exec 会分别把传入的 str 用 不同模式的 compile 进行编译后再执行。下面这样的代码则可以跳过这样的限制

>>> eval(compile('if 1: print("Hello")', '<string>', 'exec'))
Hello