何时使用 "eval" 模式而不是 "exec" 与 Python compile()
When to use "eval" mode rather than "exec" with Python compile()
Python的内置compile
函数有eval
、exec
和single
三种模式。 single
模式似乎有点没用 (ref)。 eval
和 exec
怎么样?
- eval:适用于
expression
- exec:在
statements
上工作
但是 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
本身是一个主要在表达式语句中调用的函数,而不是作为更大表达式的一部分。)
Python的内置compile
函数有eval
、exec
和single
三种模式。 single
模式似乎有点没用 (ref)。 eval
和 exec
怎么样?
- eval:适用于
expression
- exec:在
statements
上工作
但是 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
本身是一个主要在表达式语句中调用的函数,而不是作为更大表达式的一部分。)