我想知道 __future__
如何与 eval
and exec
(以及 compile
,我猜(。
实验(使用Python 2(表明,模块级__future__
导入确实对eval
和exec
执行的代码有影响:
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
但是,实验只能使您走得太远。我的问题是:
- 这些互动定义明确且记录了吗?
- 有没有办法 disable 模块级别的
__future__
在eval
,exec
和compile
中导入?
根据语言参考:
由呼叫内置功能
exec()
和compile()
编译的代码 这发生在包含未来语句的模块M
中,将由 默认,使用与未来相关的新语法或语义 语句。
您可以在compile
中禁用此行为:
可选参数 flags 和 dont_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__
的使用情况。