如何在使用新语言功能的程序中检查Python版本?
问题内容:
如果我有一个至少需要特定版本Python的Python脚本,那么使用较早版本的Python启动该脚本时,正确地正常失败的正确方法是什么?
如何尽早获得控制权以发出错误消息并退出?
例如,我有一个使用ternery运算符(2.5中的新增功能)和“
with”块(2.6中的新增功能)的程序。我写了一个简单的解释程序版本检查程序,这是脚本会调用的第一件事……只是它没有那么远。相反,脚本在python编译期间失败,甚至没有调用我的例程。因此,脚本用户会看到一些非常模糊的synax错误回溯-
这几乎需要专家来推断,这只是运行错误版本的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
:
try:
eval("1 if True else 2")
except SyntaxError:
# doesn't have ternary
另外,with
是 可以在Python 2.5,只需添加from __future__ import with_statement
。
编辑:要尽早获得控制权,您可以将其拆分为不同的.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 *