首页 > 解决方案 > eval 和 exec 究竟如何与 __future__ 交互?

问题描述

我想知道__future__导入如何与evalexeccompile我猜是和)交互。

实验(使用 python 2)表明模块级导入确实对and__future__执行的代码有影响:evalexec

from __future__ import print_function

print(1, end='!\n')
eval(r"print(2, end='!\n')")
exec r"print(3, end='!\n')"

输出:

1!
2!
3!

但同时,执行的代码exec可以执行自己的__future__导入,只影响本地代码:

print 1
exec r"from __future__ import print_function; print(2, end='!\n')"
print 3
exec r"print 4"

输出:

1
2!
3
4

但实验只能让你走这么远。我的问题是:

标签: pythoneval

解决方案


根据语言参考

默认情况下,通过调用内置函数编译exec()compile() 出现在M包含未来语句的模块中的代码将使用与未来语句关联的新语法或语义。

您可以在以下位置禁用此行为compile

可选参数flagsdont_inherit控制哪些未来语句(参见PEP 236)影响source的编译。

例如:

>>> from __future__ import print_function
>>> print('foo', 'bar')
foo bar
>>> code1 = compile("print('foo', 'bar')", "<string>", "exec")
>>> exec(code1)
foo bar
>>> code2 = compile("print('foo', 'bar')", "<string>", "exec", dont_inherit=True)
>>> exec(code2)
('foo', 'bar')

__future__反过来,据我所知,在正在执行/编译的任意代码中禁用导入是不可能的。


推荐阅读