您如何优雅地处理失败的未来功能导入?如果用户使用 Python 2.5 运行并且我的模块中的第一条语句是:
from __future__ import print_function
为 Python 2.5 编译此模块将失败并显示:
File "__init__.py", line 1
from __future__ import print_function
SyntaxError: future feature print_function is not defined
我想通知用户他们需要使用 Python >= 2.6 重新运行该程序,并可能提供一些有关如何执行此操作的说明。然而,引用PEP 236 http://www.python.org/dev/peps/pep-0236/:
唯一可以出现在前面的行
future_statement 是:
- 模块文档字符串(如果有)。
- 评论。
- 空行。
- 其他 future_statements。
所以我不能做这样的事情:
import __future__
if hasattr(__future__, 'print_function'):
from __future__ import print_function
else:
raise ImportError('Python >= 2.6 is required')
因为它产生:
File "__init__.py", line 4
from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
PEP 中的这段代码似乎给了内联执行此操作的希望:
问:我想包装 future_statements
在 try/ except 块中,所以我可以使用
不同的代码取决于
我正在运行的Python版本。为什么
我不能吗?
答: 抱歉! try/ except 是一个运行时
特征; future_statement 是
主要是编译时的噱头,以及
你的尝试/例外发生很久之后
编译器完成。也就是说,由
当你尝试/除外时,语义
对模块有效的已经是
木已成舟。由于尝试/例外
达不到它的目的looks就像它应该完成的那样,这只是
不允许。我们也想保留
这些特殊的语句很容易
发现并认识。
请注意,您can导入 __future__
直接使用信息
它与 sys.version_info 一起
弄清楚你在哪里发布
运行在与a相关的立场下
给定功能的状态。
Ideas?