何时使用 "eval" 模式而不是 "exec" 与 Python compile()

When to use "eval" mode rather than "exec" with Python compile()

Python的内置compile函数有evalexecsingle三种模式。 single 模式似乎有点没用 (ref)。 evalexec 怎么样?

但是 expression 一个 statement。我的问题是:为什么不一直使用 exec

PS:我读过一些相关的问题,比如Python built-in function "compile". What is it used for?。他们很好地解释了模式之间的区别,但没有直接回答我的问题。

就像 eval 内置函数一样,compile eval 模式创建一个代码对象来计算表达式 和 return 它的结果 .相反,exec 模式没有 return 结果。

>>> exec_code = eval(compile("1 + 2", "<stack overflow>", "exec"))
>>> eval(exec_code)  # no result for "exec" mode code
>>> eval_code = eval(compile("1 + 2", "<stack overflow>", "eval"))
>>> eval(eval_code)  # some result for "eval" mode code
3

But an expression is a statement.

这不是真的。表达式的计算结果为一个值,而语句则没有。

虽然 expression statements 表示一个表达式可以“用作”语句,但这并不能使两者等价。一个表达式语句包含一个表达式;当 运行 时,语句计算表达式但丢弃结果。

表达式不是语句,但有一种语句(表达式语句)由单个表达式组成。这种巧妙的间接方式允许解析器将 Python 模块视为一系列语句,而不是一系列语句 and/or 表达式。

一个表达式有一个值;表达式语句不会:它只是计算表达式(主要是为了它的副作用)并丢弃该值。

eval returns 计算表达式的值。

exec 将表达式作为表达式语句执行,但丢弃表达式的值。 (exec 本身是一个主要在表达式语句中调用的函数,而不是作为更大表达式的一部分。)