如果我有一个至少需要特定版本的 Python 的 Python 脚本,那么当使用早期版本的 Python 启动脚本时,优雅地失败的正确方法是什么?
如何尽早获得控制权以发出错误消息并退出?
例如,我有一个程序使用三元运算符(2.5 中的新功能)和“with”块(2.6 中的新功能)。我写了一个简单的小解释器版本检查程序,这是脚本首先调用的......但它没有那么远。相反,脚本在 python 编译期间失败,甚至在我的例程被调用之前。因此,脚本的用户会看到一些非常模糊的语法错误回溯——这几乎需要专家来推断这只是运行错误版本的 Python 的情况。
我知道如何检查 Python 的版本。问题是某些语法在旧版本的 Python 中是非法的。考虑这个程序:
import sys if sys.version_info < (2, 4): raise "must use python 2.5 or greater" else: # syntax error in 2.4, ok in 2.5 x = 1 if True else 2 print x
在 2.4 下运行时,我想要这个结果
$ ~/bin/python2.4 tern.py must use python 2.5 or greater
而不是这个结果:
$ ~/bin/python2.4 tern.py File "tern.py", line 5 x = 1 if True else 2 ^ SyntaxError: invalid syntax
(为同事通灵。)
您可以使用以下方法进行测试eval:
eval
try: eval("1 if True else 2") except SyntaxError: # doesn't have ternary
此外,在 Python 2.5with 中from __future__ import with_statement可用,只需添加.
with
from __future__ import with_statement
编辑:为了尽早获得控制,您可以将其拆分为不同.py的文件并在导入之前检查主文件中的兼容性(例如在__init__.py包中):
.py
__init__.py
# __init__.py # Check compatibility try: eval("1 if True else 2") except SyntaxError: raise ImportError("requires ternary support") # import from another module from impl import *