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