假设我开发了一个用Python编写的通用最终用户实用程序.以前,我只有一个版本适用于Python 2.3之后的版本.可以说,"如果需要,请下载Python,然后运行此脚本".源代码管理中只有一个版本的脚本(我正在使用Git)来跟踪.
使用Python 3,这不再是必然的.在可预见的未来,我需要同时开发两个不同的版本,一个适用于Python 2.x,另一个适用于Python 3.x. 从发展的角度来看,我可以想到几个选择:
在同一分支中维护两个不同的脚本,同时对两者进行改进.
维护两个独立的分支,并在开发过程中来回合并常见的变更.
只维护脚本的一个版本,并检查将脚本从一个版本转换为另一个版本的补丁文件.如果已进行足够的更改以使修补程序不再适用,请解决冲突并创建新修补程序.
我目前倾向于选项3,因为前两个将涉及很多容易出错的单调乏味.但是选项3似乎很乱,我的源代码控制系统应该是为我管理补丁.
对于分发包装,有更多选项可供选择:
提供两个不同的下载包,一个适用于Python 2,另一个适用于Python 3(用户必须知道为他们拥有的任何Python版本下载正确的下载包).
提供一个下载包,里面有两个不同的脚本(然后用户必须知道运行正确的脚本).
一个包含两个特定于版本的脚本的下载包,以及一个可以在两个Python版本中运行的小型存根加载程序,它运行安装的Python版本的正确脚本.
我现在再次倾向于选项3,尽管我还没有尝试开发这样的存根加载器.
还有其他想法吗?
编辑:我的原始答案基于2009年的状态,Python 2.6和3.0作为当前版本.现在,使用Python 2.7和3.3,还有其他选择.特别是,现在使用Python 2和Python 3的单个代码库是完全可行的.
请参阅将Python 2代码移植到Python 3
原始答案:
该负责人建议说:
要将现有的Python 2.5或2.6源代码移植到Python 3.0,最佳策略如下:
(先决条件:)从优秀的测试覆盖率开始.
端口到Python 2.6.这应该不是Python 2.x到Python 2的平均端口.(x + 1).确保所有测试都通过.
(仍在使用2.6 :)打开-3命令行开关.这将启用有关将在3.0中删除(或更改)的功能的警告.再次运行您的测试套件,并修复您收到警告的代码,直到没有任何警告,并且您的所有测试仍然通过.
在源代码树上运行2to3源到源转换器.(有关此工具的更多信息,请参阅2to3 - 自动Python 2到3代码转换.)在Python 3.0下运行转换结果.手动修复任何剩余问题,修复问题直到所有测试再次通过.
不建议尝试编写在Python 2.6和3.0下运行不变的源代码; 你必须使用非常扭曲的编码风格,例如避免打印语句,元类等等.如果您要维护一个需要同时支持Python 2.6和Python 3.0的库,最好的方法是通过编辑2.6版本的源代码并再次运行2to3转换器来修改上面的步骤3,而不是编辑3.0版本的源代码.
理想情况下,您最终会得到一个版本,即2.6兼容,可以使用2to3转换为3.0.在实践中,您可能无法完全实现此目标.因此,您可能需要进行一些手动修改才能使其在3.0下工作.
我会在分支中维护这些修改,就像你的选项2.但是,我不考虑在这个分支中维护最终的3.0兼容版本,而是考虑在2to3翻译之前应用手动修改,并将这个修改后的2.6代码放入你的科.这种方法的优点是该分支与2.6中继之间的差异相当小,并且只包括手动更改,而不是2to3所做的更改.这样,单独的分支应该更容易维护和合并,并且您应该能够从2to3中的未来改进中受益.
或者,采取一些"观望"的方法.继续您的移植只能使用单个2.6版本加2to3翻译,并推迟剩余的手动修改,直到您真正需要3.0版本.也许到了这个时候,你不再需要任何手动调整......