您如何优雅地处理将来失败的功能导入?如果用户使用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_statement。
所以我不能做这样的事情:
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主要是编译时的mm头,并且try / except会在编译器完成很长时间之后发生。也就是说,在您尝试/例外时,对模块有效的语义已经完成。由于try / except无法完成看起来 应该完成的工作,因此完全不允许这样做。我们还希望使这些特殊声明易于查找和识别。
请注意,您可以直接导入__future__,并使用其中的信息以及sys.version_info来确定相对于给定功能的状态,您正在运行的发行版所处的位置。
有想法吗?
#ifdef
作为编译时的mm头,因此我可以__future__
在一个步骤中优雅地处理所有这些问题。文件?AAAARRGGGHHH .....