python - eval 和 exec 究竟如何与 __future__ 交互?
问题描述
我想知道__future__
导入如何与eval
和exec
(compile
我猜是和)交互。
实验(使用 python 2)表明模块级导入确实对and__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
解决方案
根据语言参考:
默认情况下,通过调用内置函数编译
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__
反过来,据我所知,在正在执行/编译的任意代码中禁用导入是不可能的。
推荐阅读
- java - 未通过 IBM WCS 中的 Web 活动获取 URL 参数
- python - 在 django 中查看查询历史记录
- powershell - 为 AccessObjects 创建 comobject
- scala - Circe - 如何为额外类型指定编码器?
- javascript - 使用 jQuery ajax 调用在内部弹出带有表单元素的引导程序
- bash - 选择一个选项后如何让bash菜单程序不退出
- sql-server - DTS 依赖的 SQL Server 数据库
- mvvm - 使用 tableview 作为可搜索的输入
- javascript - 如何生成一个填充了几个不同值的数组?
- acumatica - Acumatica - 将所有通用查询导出和导入到另一家公司