11

2to3 是一个 Python 程序,它读取 Python 2.x 源代码并应用一系列修复程序将其转换为有效的 Python 3.x 代码

考虑https://docs.python.org/3/library/2to3.html#fixers中列出的四十个修复程序。按照设计,它们都输出有效的 Python 3 代码。哪个输出有效的 Python 2代码?

例如,“将旧的不等式语法转换为”的修复程序 NE<>具有!=此属性,因为!=它在 Python 2 和 Python 3 中都是有效的。

__nonzero__而“重命名为”的修复程序 NONZERO__bool__没有该属性,因为__bool__Python 2.7 中没有函数。

4

1 回答 1

0

来自Python 3.0 的新增功能

不建议尝试编写在 Python 2.6 和 3.0 下都运行不变的源代码;您必须使用非常扭曲的编码风格,例如避免打印语句、元类等等。如果您正在维护一个需要同时支持 Python 2.6 和 Python 3.0 的库,最好的方法是通过编辑 2.6 版本的源代码并再次运行 2to3 转换器来修改上面的步骤 3,而不是编辑 3.0 版本的源代码。

那里的链接非常好,因为它还列出了 3.0 中的大多数主要新功能和更改

至于你的问题,我能找到的最接近你所要求的是Six,它不是转换器或修复程序,而是一个兼容性库,可以为你处理很多扭曲的编码。也就是说,我不知道它的工作情况如何,而且无论如何都需要对现有代码进行大量更改才能利用它。

主要问题是 Python 3.x 改变了语法的许多基本方面,以至于如果没有某种兼容层,相同的代码几乎不可能在 3.x 和 2.x 上以相同的方式工作。Python 2 的字符串与 Python 3 的字符串不同。整数也是如此,Python 3 甚至不再有 long 类型(Python 3 int 是 longs 曾经的样子,而旧的 Python 2 int 已经不复存在了)。许多内置函数和属性已被重命名或修改,并且大部分语法已以完全破坏向后兼容性的方式进行更改或清理。

使用 2to3 将代码移植到 Python 3稍微解释了 2to3 及其作用,列出的大量语法更改有望足以解释为什么生成的代码不再适用于 Python 2.x。

于 2014-11-07T09:39:02.487 回答