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

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

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

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

使用 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 在已转换其打印语句的代码上运行修复程序。 -e 也可用于使 exec() 成为一个函数。

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

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


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

3.2.3 新功能: 增加了 -W 标志。


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

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

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

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


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

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

修理工

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


lib2to3 - 2to3 的库

源代码: :source:`Lib/lib2to3/`



自 3.10 版起已弃用:Python 3.9 将切换到 PEG 解析器(请参阅 PEP 617),并且 Python 3.10 可能包含无法解析的新语言语法lib2to3 的 LL(1) 解析器。 lib2to3 模块可能会在未来的 Python 版本中从标准库中删除。 考虑第三方替代方案,例如 LibCSTparso


笔记

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