我想在exec函数中使用 future 模块。但它看起来只在当前的exec函数中生效,而不是以下的exec调用。以下代码显示了这些问题。第二个 future 模块会生效,因为您可以看到输出hello world
正是我所期望的。我有什么想念的吗?感谢
>>> ns = {}
>>> exec("from __future__ import print_function", ns)
>>> exec("print('hello', 'world')", ns)
('hello', 'world')
>>> exec("from __future__ import print_function\nprint('hello', 'world')", ns)
hello world
答案 0 :(得分:2)
from __future__
导入实际上是编译器开关,仅适用于正在编译的单个单元。您有两个单独的exec()
调用,未来的语句不会发生。编译标志不存储在您执行代码的全局或本地命名空间中。
所以是的,您需要在每次调用exec()
之前添加一行。
您还可以使用compile()
function首先生成代码对象,然后传递给exec()
; compile()
允许您设置标记,而不必将开关拼写为from __future__ import
行:
import __future__
flags = __future__.print_function.compiler_flag
exec(compile("print('hello', 'world')", '', 'exec', flags=flags))