python 3 语义版本化并且向前兼容

And*_*omb 10 python backwards-compatibility forward-compatibility python-3.x

我正在研究一些想要引入 Python 3.6 以便在以 3.5 为标准的环境中使用的软件。阅读Python的文档我找不到任何关于是否:

  • 3.5代表一个语义版本号
  • 3.6 代表向前兼容的升级(即:为 3.5 运行时编写的代码保证可以在 3.6 运行时运行)

事实上,这个关于移植到 3.7 的页面的存在让我强烈认为,但我看不到关于版本号含义的官方文档(如果有的话,ala Linux 内核版本控制)

从更一般的意义上来说 - 3.X 版本流中是否存在围绕兼容性标准的 PEP?

Sha*_*ger 13

简短的答案是“不”,详细的答案是“他们追求接近它的东西”。

一般来说,微版本符合语义版本控制规则;他们不应该破坏任何东西或添加功能,而只是修复错误。情况并非总是如此(例如3.5.1在 a 上中断,因为它导致了一个比出现时中断更严重的错误vars()namedtuple),但对于代码来说这是非常罕见的(尤其是 Python 级别的东西,而不是 C 扩展) )突破微观边界。

次要版本主要是“添加功能”,它们也会做出与先前警告不向后兼容的更改。例如,asyncandawait成为 Python 3.7 中的关键字,这意味着使用它们作为变量名的代码会损坏,但启用警告后,您会DeprecationWarning在 3.6 中看到 a 。许多语法更改最初是作为特殊__future__模块的可选导入引入的,并记录了成为默认行为的时间表。

次要版本中所做的更改都不是广泛的更改;我怀疑任何单独的弃用或语法更改是否会影响现有源代码的 1%,但它确实发生了。如果您有一百个第三方依赖项,并且要跳转一两个次要版本,那么其中一个版本很有可能会因更改而被破坏(例如:pika0.12用作async变量名之前,并在 Python 3.7 上崩溃;他们发布了修复该错误的新版本,但是当然,从0.11更低版本到0.12更高版本改变了他们自己的 API,这可能会破坏你的代码)。

主要版本大致如您所期望的那样;向后不兼容的更改是预期/允许的(尽管它们通常不会轻率地进行;更改越大,好处就越大)。

要点是,它接近语义版本控制,但为了不每隔几年发布一次主要版本,同时也不让语言由于严格的兼容性限制而停滞不前,只要存在,就允许次要版本破坏少量现有代码是警告(通常以使用已弃用行为的代码的实际警告、新增功能文档的注释以及有时__future__支持简化迁移路径的形式)。

这一切都在其开发周期文档中正式记录(细节稍少) :

为了澄清术语,Python 使用了major.minor.micro生产就绪版本的术语。因此,对于 Python 3.1.2 Final,即主要版本3、次要版本1 和微型版本2。

  • 新的主要版本是例外;只有当强烈不兼容的变化被认为是必要的并且提前很长时间计划时,它们才会出现;
  • 新的次要版本是功能版本;它们每年都会从当前正在开发的分支中发布;
  • 新的微型版本是错误修复版本;他们大约每两个月被释放一次;它们是在维护部门准备的。