如何检查 Python 代码是否向后兼容?

15

我有一些代码,想要让它与ESRI的地理处理器相配合。然而,ESRI的地理处理器运行在Python 2.2、2.3、2.4和2.5上,我们需要让我们的工具在任何版本上都能够正常工作。因此,我花了很多时间编写不同版本的解决方案和编码技巧,以便包装的地理处理器在所有版本上具有相同的功能。

现在有个大问题是,是否有某种应用程序可以基本扫描模块,以查看其语法和方法是否与上述Python版本向后兼容呢?

不幸的是,我不能安装Python 2.2,因为我拥有Arcgis 9.3,它需要Python 2.5。反之亦然,我已经解决并排除了几乎所有的模块依赖关系。(例如win32com、ctypes等)。

但是我很担心我的实际代码,如果我去阅读每个版本添加的关键字等细节,可能需要花费数小时,这肯定会非常麻烦。是否有某种应用程序可以帮助我进行这些操作?


可能是确定所需的Python最低版本的工具?的重复。 - anatoly techtonik
2个回答

11
如果你正在积极开发商业产品,并且真的想很好地支持所有这些版本,我建议:
  1. 编写一套自动化测试套件,可以运行并测试你的整个库/应用程序/其他功能。
  2. 为每个测试环境设置一台机器或虚拟机,最好包括python 2.2-2.6和任何平台组合(如果你的产品不仅限于win32)。现在有几个免费的虚拟化产品(VirtualBox和VMWare Server)可以轻松实现此功能。
  3. 使用类似buildbot这样的工具来自动化运行所有其他平台上的测试,并收集结果。
我可能需要提醒一下,2.2到2.3之间有重大改变,再次在2.3到2.4之间也有重大改变。这就是为什么大多数python库只支持2.3,而一些正在转向只支持2.4及以上。
每个主要版本都有一个“Python 2.x有什么新功能”的文档,但是针对2.2进行编码意味着你将错过以下功能:
  • 生成器 (2.3) (实际上,你可以使用from __future__ import generators在2.2中获得它们)
  • 生成器表达式 (2.4)
  • 子进程模块 (2.4)
  • 装饰器语法 (2.4)
  • 集合 (2.3)
  • 十进制 (2.4,但可以回溯到旧版本)
  • 日期时间 (2.3)
  • 迭代工具 (2.3)
这只是你可能无法使用的一小部分很棒的功能。
你必须认真考虑你有多想支持一个7年前的python版本,并失去很多可以减少代码大小(或可能只是增加可读性)的很酷的功能。

大约超过50%的ArcGIS用户仍在使用9.1 / 9.0,需要分别使用2.3或2.2。如果没有相应版本的Python,您将无法使用它们的Python模块。我知道这很糟糕,但ESRI并不真正关心。特别是当有3种不同的API时,9.3具有Pythonic API,9.2不是真正的Pythonic,但通过枚举执行所有操作。9.1及以下版本使用一组奇怪的自定义COM库和win32com.client.Dispatch。我知道这很糟糕。 - UberJumper
看起来你可以从自动化测试套件和buildbot中受益良多。特别是如果你希望你的产品在使用了三种不同的API时表现一致,一些深思熟虑的回归测试将会为未来带来巨大的回报。许多项目已经配置了他们的构建机器人以在每次VCS提交时运行,并且如果有任何测试失败就会向他们发送电子邮件。这可以更快地解决新引入的错误。 - Crast

10

试试 pyqver:https://github.com/ghewgill/pyqver/

通过分析所使用的关键字和模块,为给定的 Python 脚本提供最低版本信息。

此外,您可以本地编译 Python 2.2 并使用 virtualenv 创建一个 Python 2.2 环境,使用 --python 标志。


virtualenv需要setuptools,而setuptools需要python 2.3.5及以上版本。此外,快速浏览virtualenv.py本身显示它导入了“logging”,这只在python 2.3及以上版本中可用。它还需要来自2.4的“subprocess”模块,可以将其回溯到2.3,但即使代码本身也只承认“可能会工作”。是的,python 2.2真的已经停止维护了,甚至许多有用的工具也不支持它。 - Crast
太棒了。我一会儿就试试看。但是实际上只是在看某些东西。我想我要蜷缩起来哭了。 - UberJumper
我也不能安装低版本的Python,因为它们会阻止我使用已安装的任何ArcGIS地理处理Python库。它需要匹配的版本,我不能在一台机器上安装多个ArcGIS版本。所以我想我要看看虚拟机能做什么。唉。 - UberJumper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接