2 to3-自动 Python 2 到 3 代码翻译

2 to3 是一个 Python 程序,它读取 Python 2.x 源代码并应用一系列* fixers *将其转换为有效的 Python 3.x 代码。标准库包含一组丰富的修复程序,可以处理几乎所有代码。但是 2to3 支持库lib2to3是一个灵活且通用的库,因此可以为 2to3 编写自己的修复程序。 lib2to3还可以适用于需要自动编辑 Python 代码的自定义应用程序。

Using 2to3

2 to3 通常会与 Python 解释器一起作为脚本安装。它也位于 Python 根目录的Tools/scripts目录中。

2 to3 的基本参数是要转换的文件或目录的列表。对于 Python 源,递归遍历目录。

这是一个示例 Python 2.x 源文件example.py

def greet(name):
    print "Hello, {0}!".format(name)
print "What's your name?"
name = raw_input()
greet(name)

可以在命令行上pass 2to3 将其转换为 Python 3.x 代码:

$ 2to3 example.py

将打印与原始源文件的差异。 2to3 还可以将所需的修改直接写回到源文件。 (除非也给出了-n,否则将备份原始文件.)使用-w标志启用回写更改:

$ 2to3 -w example.py

转换后,example.py如下所示:

def greet(name):
    print("Hello, {0}!".format(name))
print("What's your name?")
name = input()
greet(name)

Comments 和确切的缩进将在整个翻译过程中保留。

默认情况下,2to3 运行一组predefined fixers-l标志列出了所有可用的修复程序。可以使用-f给出一组明确的修复程序。同样,-x明确禁用修复程序。以下示例仅运行importshas_key修复程序:

$ 2to3 -f imports -f has_key example.py

此命令运行除apply修复程序之外的所有修复程序:

$ 2to3 -x apply example.py

有些修复程序是* explicit *,这意味着它们默认情况下不会运行,必须在命令行中列出才能运行。在这里,除了默认的修复程序外,还运行idioms修复程序:

$ 2to3 -f all -f idioms example.py

请注意,传递all如何启用所有默认修复程序。

有时 2to3 会在您的源代码中找到一个需要更改的位置,但是 2to3 无法自动修复。在这种情况下,2to3 将在差异文件下方显示警告。您应该解决该警告,以获取兼容的 3.x 代码。

2 to3 也可以重构 doctest。要启用此模式,请使用-d标志。注意,* only * doctests 将被重构。这也不需要模块是有效的 Python。例如,reST 文档中的 doctest 之类的示例也可以使用此选项进行重构。

-v选项可输出有关翻译过程的更多信息。

由于某些打印语句可以解析为函数调用或语句,因此 2to3 不能始终读取包含打印Function的文件。当 2to3 检测到from __future__ import print_function编译器指令的存在时,它将修改其内部语法以将print()解释为函数。也可以使用-p标志手动启用此更改。使用-p在已转换其打印语句的代码上运行修复程序。

-o--output-dir选项允许指定要写入的已处理输出文件的备用目录。使用此标记时需要-n标志,因为不覆盖 Importing 文件时,备份文件没有意义。

版本 3.2.3 的新Function:添加了-o选项。

-W--write-unchanged-files标志告诉 2to3 始终写入输出文件,即使不需要更改文件也是如此。这对于-o最为有用,因此可以将整个 Python 源树复制并从一个目录复制到另一个目录。该选项暗含-w标志,因为否则它没有意义。

版本 3.2.3 的新Function:添加了-W标志。

--add-suffix选项指定要附加到所有输出文件名的字符串。指定此名称时需要-n标志,因为写入不同的文件名时不需要备份。例:

$ 2to3 -n -W --add-suffix=3 example.py

将导致转换后的名为example.py3的文件被写入。

版本 3.2.3 的新Function:添加了--add-suffix选项。

要将整个项目从一个目录树转换为另一种使用:

$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode

Fixers

转换代码的每个步骤都封装在修复程序中。命令2to3 -l列出了它们。作为documented above,每个都可以单独打开和关闭。它们在这里有更详细的描述。

From To
failUnlessEqual(a, b) assertEqual(a, b)
assertEquals(a, b) assertEqual(a, b)
failIfEqual(a, b) assertNotEqual(a, b)
assertNotEquals(a, b) assertNotEqual(a, b)
failUnless(a) assertTrue(a)
assert_(a) assertTrue(a)
failIf(a) assertFalse(a)
failUnlessRaises(exc, cal) assertRaises(exc, cal)
failUnlessAlmostEqual(a, b) assertAlmostEqual(a, b)
assertAlmostEquals(a, b) assertAlmostEqual(a, b)
failIfAlmostEqual(a, b) assertNotAlmostEqual(a, b)
assertNotAlmostEquals(a, b) assertNotAlmostEqual(a, b)
L = list(some_iterable)
L.sort()

更改为

L = sorted(some_iterable)
From To
operator.isCallable(obj) callable(obj)
operator.sequenceIncludes(obj) operator.contains(obj)
operator.isSequenceType(obj) isinstance(obj, collections.abc.Sequence)
operator.isMappingType(obj) isinstance(obj, collections.abc.Mapping)
operator.isNumberType(obj) isinstance(obj, numbers.Number)
operator.repeat(obj, n) operator.mul(obj, n)
operator.irepeat(obj, n) operator.imul(obj, n)

lib2to3-2to3 的 Repository

源代码: Lib/lib2to3/


Note

lib2to3 API 应该被认为是不稳定的,将来可能会发生巨大变化。

首页