__future__模块在exec中不起作用

时间:2018-04-03 08:44:52

标签: python exec

我想在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

1 个答案:

答案 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))