25.4. 2to3 - 自动 Python 2 到 3 代码转换 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/2to3
跳转至:导航、​搜索

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

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

25.4.1. 使用 2to3

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

2to3 的基本参数是要转换的文件或目录列表。 递归遍历目录以获取 Python 源代码。

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

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

可以通过命令行中的 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)

在整个翻译过程中保留注释和精确缩进。

默认情况下,2to3 运行一组 预定义的修复程序-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 代码。

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

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

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

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

2.7.3 新功能:增加了-o选项。


-W--write-unchanged-files 标志告诉 2to3 始终写入输出文件,即使文件不需要更改。 这对 -o 最有用,以便将整个 Python 源代码树复制并从一个目录转换到另一个目录。 这个选项意味着 -w 标志,否则它没有意义。

2.7.3 新功能: 添加了 -W 标志。


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

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

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

2.7.3 新功能:增加了--add-suffix选项。


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

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

25.4.2. 修理工

转换代码的每一步都封装在一个固定器中。 命令 2to3 -l 列出了它们。 正如上面所述的,每个都可以单独打开和关闭。 此处更详细地描述了它们。


25.4.3. 库2到3 - 2to3 的图书馆

笔记

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