你应该选择使用Python 2还是Python 3来进行开发?(四)

我想使用Python 3, 但是有个想用的小型库只支持Python 2. 真的要返回到Python 2,或者放弃使用这个库?

假如找不到一个支持Python 3的替代包,你还有一些选项可以考虑:

  • 把库移植到3.x(移植意味着让这个库在3.x上能工作)
  • 如果移植非常艰难,而且所有其它依赖项都存在于2.x,考虑从2.x开始吧。正如在其它地方已经解释,良好的2.x代码会典型地让转换无痛,只要每一个依赖项都成功移植。
  • 决定这个特性是否真的那么重要?也许你可以放弃这个特性?

理想的情况是你把这个库移植到3.x。通常你会发现已经有人在做这个事情。即使不是这种情况,现有的项目成员会很感激这种帮助,尤其是移植会发现原来软件的问题,提升原来软件和3.x移植版本的质量。移植并不总是那么容易,但是通常比自己从草稿开始写要容易。

你应该怎么做移植在这篇Python 2移植向导里面有说明。基本理念是采用2.x版本的库,当在Python 2中使用-3命令行开关,检查所有的单元测试都能通过而没有警告。如果测试失败或者出现警告,修改源文件再次尝试(这时可能需要放弃对旧Python版本的兼容性)。一旦使用-3开关运行无警告,便可尝试使用Python 3运行。最好的可能情况是“恰好工作”– 使用新式的Python 2习语书写的代码从源头上兼容Python 3,那么“移植”在这个点就完成了。

如果在Python 3下仍然测试失败,标准库工具2to3通常会自动创建一个版本能在Python 3下运行。另外一种替代情况是,Armin Ronacher的Python现代化工具把Python 2.6+和3.2+或3.3+作为目标(决定于所使用的命令行工具)。(如果使用后者,重点是检查Python 2下也能测试通过!)

上述任何一种方法都能让单一的2.x代码基础同时支持2.x和3.x变得可行。这比同时维护单独支持2.x和3.x的代码分支要简单的多(关于这个可以问下Python核心开发者–他们已经被这件事情卡住好多年了)。

如果使用自动化转换和现代化工具后仍然测试失败,那么代码可能受到Python 2和Python 3语义变化的影响,这种情况转换器不能自动处理并且不能被-3开关检测到。这种问题应该非常稀少,但是可能存在–如果有人遇到,值得给CPython提交一个问题要求一个新的-3警告。

如果涉及到C扩展模块而且项目没有使用一个封装器生成器,像Cython, cffi 或者SWIG ,它们会自动处理Python 2和Python 3的不同点,移植情况可能会变得更加复杂。但即使是这样移植仍然会比发明自己的等价包要容易。扩展移植向导涵盖了一些关键不同点。

在维基上的深度向导中有更多内容:PortingPythonToPy3k, PortingExtensionModulesToPy3k

我决定用3.x写一些东西,但是使用者只有2.x,我应该怎么做?

除了2to3工具运行从2.x的源码产生3.x的代码,也有3to2工具,这个能把3.x代码向后转换为2.x代码。理论上,这个工具比另一个方向的工具更好用,因为3.x没有这么多的肮脏角落情况需要转换器处理(消除尽量多的肮脏角落是打破向后兼容性的一个最重要的原因)。然而,大量使用仅3.x支持特性的代码(比如函数注释或者扩展元组解包)可能不会转换成功。

很可能也是公平地说,这个阶段相比2to3工具,3to2工具是少有人走的路,所以你可能在任何地方遇到艰难险阻。然而,如果你想写3.x代码,这完全是一个值得探索的想法。

未完待续。。。To be continued…
原文参考:
https://wiki.python.org/moin/Python2orPython3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值