2to3 – 自动Python 2到3代码转换

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

使用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 flag:

$ 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 fixers:

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

此命令运行除apply fixer之外的每个修复程序:

$ 2to3 -x apply example.py

一些修复程序是explicit,意味着它们不是默认运行的,必须在要运行的命令行上标记。这里,除了默认的修复程序,idioms修复程序运行:

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

请注意如何通过all启用所有默认修复程序.

有时2to3会在源代码中找到需要更改的位置,但2to3无法自动修复。在这种情况下,2to3将在diff的下方为文件打印警告。您应该解决警告,以便符合3.x代码.

2to3也可以重构doctests。要启用此模式,请使用-d标志。请注意only doctests将被重构。这也不要求模块是有效的Python。例如,doctest就像reSTdocument中的例子也可以用这个选项重构.

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

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

// -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

Fixers

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

apply

删除apply()的用法。例如apply(function, *args,**kwargs)转换为function(*args, **kwargs).

asserts

替换弃用的unittest方法名称正确的.

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)
basestring

转换basestringstr.

buffer

转换buffermemoryview。这个修理器是可选的,因为memoryviewAPI类似但不完全相同的buffer.

dict

修复字典迭代方法。dict.iteritems()转换为dict.items(), dict.iterkeys()dict.keys(),和dict.itervalues()dict.values()。同样,dict.viewitems(), dict.viewkeys()dict.viewvalues()被转换为dict.items(), dict.keys()dict.values()。它还包含了dict.items(),dict.keys()dict.values()的现有用法,在调用list.

except

转换except X, Texcept X as T.

exec

转换exec声明exec()功能

execfile

删除execfile()execfile()打电话给open(), compile(),和exec().

exitfunc

改变sys.exitfunc使用atexitmodule.

filter

包裹filter()用在list呼叫。

funcattrs

修复已重命名的函数属性。例如,my_function.func_closure转换为my_function.__closure__.

future

删除from __future__ import new_feature语句

getcwdu

重命名os.getcwdu()os.getcwd().

has_key

更改dict.has_key(key)key in dict.

idioms

这个可选的修复程序执行几个转换,使Python代码更加惯用。类型比较如type(x) is SomeClasstype(x) == SomeClass转换为isinstance(x, SomeClass).while 1变成while True。此修复程序还尝试在适当的位置使用sorted()。例如,这个块

L = list(some_iterable)L.sort()

更改为

L = sorted(some_iterable)
import

检测兄弟导入并将它们转换为相对导入.

imports

处理标准库中的模块重命名.

imports2

在标准库中重命名其他模块。由于技术限制,它与imports固定器分开.

input

转换input(prompt)to eval(input(prompt)).

intern

intern()转换为sys.intern().

isinstance

修复isinstance()的第二个参数中的重复类型。例如,isinstance(x, (int, int))转换为isinstance(x,int)isinstance(x, (int, float, int))转换为isinstance(x, (int, float)).

itertools_imports

删除itertools.ifilter(), itertools.izip()itertools.imap()。进口itertools.ifilterfalse()也改为itertools.filterfalse().

itertools

改变itertools.ifilter(), itertools.izip(),和itertools.imap()他们的内置等价物itertools.ifilterfalse()改为itertools.filterfalse().

long

重命名longint.

map

包裹map()在一个 list呼叫。它也会改变map(None, x)list(x)。使用from future_builtins import map禁用thisfixer。

metaclass

将旧的元类语法(在类体中__metaclass__ = Meta)转换为新的(class X(metaclass=Meta)).

methodattrs

修复旧方法属性名称。例如,meth.im_func转换为meth.__func__.

ne

将旧的不等语法<>转换为!=.

next

转换使用迭代器next()方法到next()功能。它还将next()方法重命名为__next__().

nonzero

__nonzero__()重命名为__bool__().

numliterals

将八进制文字转换为新语法.

operator

转换对各种函数的调用在里面 operator模块到其他但等效的函数调用。在需要时,添加适当的import语句,例如import collections.abc。进行了以下映射:

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)
paren

在列表推导中需要添加额外括号。例如,[x for x in 1, 2]变成[x for x in (1, 2)].

print

print语句转换为print()函数

raise

转换raise E, Vraise E(V)raise E, V, TraiseE(V).with_traceback(T)。如果E是一个元组,那么翻译将是不正确的,因为在3.0中删除了替换元组的异常.

raw_input

转换raw_input()input().

reduce

处理移动reduce()functools.reduce().

reload

转换reload()importlib.reload().

renames

更改sys.maxintsys.maxsize.

repr

repr()函数替换反引号

set_literal

取代使用set带有set literals的构造函数。这个fixeris可选.

standarderror

Renames StandardErrorto Exception.

sys_exc

更改已弃用的sys.exc_value, sys.exc_type,sys.exc_traceback使用sys.exc_info().

throw

修改生成器中的API更改throw()方法

tuple_params

删除隐式元组参数解包。此修复程序插入temporaryvariables .

types

修复了typesmodule.

unicode

Renames unicodestr.

urllib

删除某些成员的代码,处理了urllib的重命名urllib2urllibpackage.

ws_comma

从逗号分隔的项目中删除多余的空格。这个修理器是官方的.

xrange

重命名xrange()range()并包裹现有的range()来电话list.

xreadlines

改变for x in file.xreadlines()for x in file.

zip

zip()电话中使用list使用当from future_builtins import zip出现时,这个被禁用.

lib2to32to3的库

源代码: Lib / lib2to3


/注意

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

评论被关闭。