如何检查代码是否向后兼容Python?
我有一些代码,想让它能和ESRI的地理处理器配合得很好。不过,ESRI的地理处理器只能在Python 2.2、2.3、2.4和2.5这些版本上运行。我们需要确保我们的工具在任何版本上都能正常工作。所以我花了很多时间来研究和编写一些解决方案,以便让这个包装的地理处理器在所有版本上都能有相同的功能。
现在有个大问题,就是有没有什么工具可以扫描模块,看看它的语法和方法是否和上面提到的Python版本兼容?
不幸的是,我不能安装Python 2.2,因为我有Arcgis 9.3,它需要Python 2.5。反过来,我已经基本上解决了所有模块的依赖问题(比如win32com、ctypes等等)。
但是我还是很担心我的实际代码。我可能需要花几个小时去查阅每个版本新增的关键词等等,这样做会非常麻烦。有没有什么工具可以帮我处理这些问题呢?
2 个回答
试试 pyqver:https://github.com/ghewgill/pyqver/
这个工具可以帮你找出运行某个 Python 脚本所需的最低版本,它会分析脚本中用到的关键词和模块。
另外,你还可以在本地编译 Python 2.2,并使用 virtualenv 创建一个 Python 2.2 的环境,方法是加上 --python 这个选项。
如果你正在积极开发一个商业产品,并且真的想要好好支持所有这些版本,我建议你:
写一个自动化测试套件,这样可以运行并测试你整个库/应用程序/其他东西的功能。
为每个测试环境设置一台机器,或者最好是虚拟机(比如 Python 2.2 到 2.6 以及任何平台组合,如果你的产品不仅仅是 win32)。现在这样做特别简单,因为有很多免费的虚拟化产品(比如 VirtualBox 和 VMWare Server)。
使用类似 buildbot 的工具来自动化在其他平台上运行测试,并收集结果。
不过我得提一下,2.2 和 2.3 之间,以及 2.3 和 2.4 之间有很大的变化。这就是为什么大多数 Python 库只支持 2.3,而现在有一些库开始只支持 2.4 及以上版本。
每个主要版本都有一个“Python 2.x 新特性”文档,但如果你只为 2.2 编码,你就会错过:
- 生成器(2.3)(其实在 2.2 中可以通过
from __future__ import generators
来使用) - 生成器表达式(2.4)
- 子进程模块(2.4)
- 装饰器语法(2.4)
- 集合(sets)(2.3)
- 十进制模块(decimal)(2.4,但可以移植到旧版本)
- 日期时间模块(datetime)(2.3)
- 迭代工具(itertools)(2.3)
这只是你可能无法使用的一小部分很棒的功能。
你真的需要考虑一下,你有多想支持一个已经有 7 年历史的 Python 版本,同时错过很多可以减少代码量(或者可能只是提高可读性)的酷炫功能。