Saturday, June 4, 2011

Python2.7与3.x版本之间的不推荐用法

原文链接: Deprecations between Python 2.7 and 3.x

最近 在python-dev上的讨论 指出了从Python2.7转移到当前Python3.x版本的开发者面临的Python当前的deprecation方针问题。 由此,并鉴于Python用户一般会直接从Python2.7转移到最新的3.x版本而不关心期间的旧版本, 开发团队修改了当前的deprecation方针。

背景

Python承诺向后兼容。不符合兼容性准则的改变时不允许发生的,这意味着当前正确的程序 不会在新版本中崩溃。然而,这并不总是可行的,比如,当有些API已经明显失效了,并即将 被其他替换调时。在这种情况下,Python遵循deprecation方针:当某项特性被正式移除之前 有一段长达1年的转换期。在这中间过程中,必须发布deprecation警告使开发者有时间更新他们 的代码。Python的deprecation方针的详细内容在 PEP 5 文档中。鉴于改变只会在新 的Python发行版中出现,而且新旧发行版之间一般有18个月的间隔,这就意味着一次发布的 deprecaton间隔刚好时标准。

这个方针的唯一例外时Python 3。Python 2到Python 3之间的大版本改变主要是为了允许 破坏向后兼容性的改变也能发生,是Python开发者能够解决当前方针下不能解决的问题。 比如,让字符串支持Unicode,以及返回迭代器而不是列表。

并行开发

大家都清楚转换到Python 3需要一些时间,很多人估计大概为5年。所以Python 2和3会并行开发 一段时间。

Python 2.7作为Python 2的最后一个发行版,大家都同意把它的维护时间大大延长。最终, 要迁移到更新版本的开发者会跳到Python 3版本。

下面就是其中一个问题...

令人吃惊的deprecation

python-dev上的帖子 中, 有人 指出在C API中的一个函数 PyCObject_AsVoidPtr, 和它带有的不充分的警告一起移除了。 但是,这是与deprecation方针相违背的!到底发生了什么?

这个改变是一个从旧API(``PyCObject``)迁移到新的,改进的(PyCapsule)过程中 的一部分。问题时 PyCObject 是Python2.6中默认且仅有的API。它在Python2.7中已经不推荐了。 在Python3.2中,那API根本不存在,所以新的 PyCapsule 应该被使用。那就有了一个 deprecation间期,从Python2.7的发布(2010年7月)到Python3.2的发布(2011年2月)—— 大约7个月。这远远小于最少12个月的间隔要求,是开发者很难支持所有的Python发行版。

对于从3.0升到3.1然后3.2的人来说,这个deprecation路径没什么问题。Python3.1在2010年 3月发布时就已经有这个deprecation,因此3.x 系列的版本都有这个deprecation,12个月的 deprecation间隔要求是满足的。然而,那并不是实际人们所做的:他们直接从Python2.7升到了 最新的3.x版本,在当期例子里时3.2,产生了这个问题。这不是python-dev的初衷,不幸的是PEP 5 并没有对同时处于积极开发的并行版本做出说明。

那么我们该怎么做?

尽管 PyCObject/PyCapsule API断线是一个明显的问题,这并不是无法解决的问题, 虽然python-dev中有人还是碰到了很多麻烦。总而言之,这问题不应该发生。

PyCObject/PyCapsule 这个特例问题已经存在,我们无法对它做什么。重新启用 PyCObject 不是一个明智之举,因为这样只会增加未来的不兼容性。然而,大众意见表明, 虽然有点繁琐,写一些多余的适配代码来使用当前可用的API,还是可行的。实际上,在Python3.1, PyCObject API是写成 PyCapsule API的封装形式的。有人建议,如果有人需要使用这API的话, Python3.1的实现可以分离成第三方库的形式。此外,大家一致同意,写一个包含这个改变的“反向” PEP,来解释这个改变背后的原因,以及帮助开发者迁移的文档资料。

作为更一般的提醒,Python开发团队现在意识到了这个问题,并开始避免它再次发生。 Guido对情况 发表了总结 并建议Python 3目前对使用deprecation尽量采取保守的态度。至少,不推荐的API在移除前 保留更长的时间,给使用Python 2.7的开发者一条顺利的迁移路径。

更间接地,这个帖子提出话题告诉大家如何在很短时间内更有效的将Python中的更改信息告诉广大的用户, ——这个也是本博客所致力于做到的。

这所有都意味着什么?

首先,这意味这Python开发者们并不是不可能犯错的。没人会迫使开发者的生活更艰苦, 只是有些问题并不能及时发现而已。

其次,解决这个问题只会带来更多的危害,所有 PyCObject API还是没有重新启用。 尽管重新启用这个API可以帮助被这个改变所害的开发者,但总体而言,这样会使兼容性 问题更复杂。同时,我们不得不忍受这个问题,并且继续前进。我们学到了教训,下次我们再也 不犯相同的错误了。

这件事还表明,Python开发团队希望听到用户的意见。兼容性是非常重要的,所有的努力都想 让大家能无缝得过渡到新版本。特别的,库开发者们在有限的努力下必须尽量支持多个Python版本。

Finally, the developers haven't abandoned 2.7. While it won't be getting new features and there will be no 2.8, the views of people using 2.7 are still important. Making sure users can move to 3.x when they are ready is vital for the whole Python community. 最后,开发者们并没有抛弃Python 2.7。尽管它不会有新功能了,并且进来也不会有Python 2.8 版本,用户使用Python2.7的反映还是很重要的。确保让用户准备好后能够顺利迁移到PYthon 3.x 对整个Python社区来说是至为重要的。

No comments:

Post a Comment