我想知道__future__
导入如何与eval
和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
但实验只能让你到目前为止。我的问题是:
__future__
,eval
和exec
中禁用模块级compile
导入?答案 0 :(得分:4)
通过调用内置函数
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__
导入是不可能的。