如何与__future __进行评估和EXEC究竟如何进行互动



我想知道 __future__如何与 eval and exec(以及 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

但是,实验只能使您走得太远。我的问题是:

  • 这些互动定义明确且记录了吗?
  • 有没有办法 disable 模块级别的__future__evalexeccompile中导入?

根据语言参考:

由呼叫内置功能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__的使用情况。

是不可能的。

最新更新