您如何优雅地处理失败的未来功能导入?如果用户使用Python 2.5运行,并且我的模块中的第一个语句是:
from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)
为Python 2.5编译此模块将失败,并带有:
File "__init__.py", line 1
from __future__ import print_function
SyntaxError: future feature print_function is not defined
Run Code Online (Sandbox Code Playgroud)
我想告诉用户他们需要用Python> = 2.6重新运行程序,并且可能提供一些如何操作的说明.但是,引用PEP 236:
在future_statement之前可以出现的唯一行是:
- 模块docstring(如果有的话).
- 评论.
- 空白行.
- 其他future_statements.
所以我做不了类似的事情:
import __future__
if hasattr(__future__, 'print_function'):
from __future__ import print_function
else:
raise ImportError('Python >= 2.6 is required')
Run Code Online (Sandbox Code Playgroud)
因为它产生:
File "__init__.py", line 4
from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
Run Code Online (Sandbox Code Playgroud)
来自PEP的这个片段似乎给了内联的希望:
问:我想将future_statements包装在try/except块中,因此我可以使用不同的代码,具体取决于我正在运行的Python版本.为什么我不能?
A:对不起!try/except是一个运行时功能; future_statements主要是编译时的噱头,你的try/except在编译完成后很久就会发生.也就是说,当你尝试使用/ except时,对模块有效的语义已经完成了.由于试/除非将无法完成它看起来 像它应该做到,它只是不允许的.我们还希望保持这些特殊陈述非常容易找到和识别.
请注意,您 …
我正在使用Python 3.x中的新打印,我观察到以下代码由于没有编译end=' '.
from __future__ import print_function
import sys
if sys.hexversion < 0x02060000:
raise Exception("py too old")
...
print("x",end=" ") # fails to compile with py24
Run Code Online (Sandbox Code Playgroud)
如何继续使用新语法但使脚本失败?是否必须调用另一个脚本并在此处仅使用安全语法?
类似于__author__或__version__顶层模块的变量,有指定支持Python版本的Python源文件中的任何约定?
我的用例是一个项目,其中包含一些需要与Python 2.4兼容的脚本.我想用一些普遍可识别的方式注意它们中的事实.
我不是在询问如何在执行期间要求最小的Python版本.我的问题是开发人员可能会意外地使用与此特定脚本需要支持的python版本不兼容的功能.PyCharm可以警告Python不兼容性.如果能够获取此注释并在每个文件的基础上配置警告,那将会很棒.