eval和exec究竟如何与__future__交互?

时间:2018-04-28 09:26:46

标签: python eval

我想知道__future__导入如何与evalexec(和compile进行互动,我猜)。

实验(使用python 2)显示模块级__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

但实验只能让你到目前为止。我的问题是:

  • 这些交互是否定义明确且有文件记录?
  • 是否有办法在__future__evalexec禁用模块级compile导入?

1 个答案:

答案 0 :(得分:4)

the language reference

  

通过调用内置函数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__导入是不可能的。