您如何优雅地处理失败的未来功能导入?如果用户使用 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:
可以出现在 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_statements 主要是编译时的噱头,您的 try/except 会在编译器完成后很久才发生。也就是说,当您尝试/排除时,对模块有效的语义已经完成。由于 try/except 不会完成它看起来 应该完成的事情,因此根本不允许这样做。我们还希望使这些特殊声明非常易于查找和识别。
请注意,您可以直接导入 __future__,并使用其中的信息以及 sys.version_info 来确定您正在运行的版本与给定功能的状态相关的位置。
想法?