__future__模块在exec函数中无法持续生效的技术咨询
关于exec中__future__模块作用域的疑问
我希望在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
解答
这其实是Python设计上的既定规则啦,__future__的导入本身就只对当前代码块/执行上下文生效,不管是在脚本里还是exec调用里都是如此。
原因很简单:__future__的导入本质是给解释器发一个「编译指令」,告诉它要启用特定的语法或行为模式。而每个exec调用都会被Python当作独立的编译单元来处理——也就是说,第一个exec里的编译指令,完全不会影响第二个exec代码的编译过程,所以第二个exec还是会用Python的默认行为(把print的多个参数当成元组打印)。
哪怕你第一个exec已经把print_function导入到了命名空间ns里也没用,因为__future__的作用是在编译阶段生效,不是运行阶段,命名空间里的模块对象改变不了后续代码的编译规则。
给你两个可行的解决办法:
- 把相关代码放在同一个exec调用里:如果可以的话,把__future__导入和需要用到新特性的代码写在同一段字符串里,这样编译时就会启用对应的特性:
ns = {} exec("from __future__ import print_function\nprint('hello', 'world')", ns) - 每个需要特性的exec都重新导入__future__:如果必须拆分多个exec调用,那每个要用到新特性的exec开头都得重新写
from __future__ import xxx,这不是你遗漏了配置,而是必须的操作。
内容的提问来源于stack exchange,提问作者zjffdu
相关产品推荐
相关产品推荐

