2to3 – 自动Python 2到3代码翻译 – 开发工具(Python教程)(参考资料)
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
def greet(name): print("Hello, {0}!".format(name))print("What"s your name?")name = input()greet(name)
在整个翻译过程中保留注释和精确缩进.
默认情况下,2to3运行一组预定义的固定器。-l
标志列出了所有可用的固定器。可以使用-f
给出一组明确的运行修复程序。同样-x
显式禁用了混音器。以下示例仅运行imports
和has_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
新版本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
-
转换
basestring
至str
.
buffer
-
转换
buffer
至memoryview
。这个修理器是可选的,因为memoryview
API类似但不完全相同的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, T
到except X as T
.
exec
-
转换
exec
声明exec()
功能
execfile
-
删除
execfile()
。execfile()
打电话给open()
,compile()
,和exec()
.
exitfunc
-
改变
sys.exitfunc
使用atexit
module.
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 SomeClass
和type(x) == SomeClass
转换为isinstance(x, SomeClass)
.while 1
变成while True
。此修复程序还尝试在适当的位置使用sorted()
。例如,这个块L = list(some_iterable)L.sort()
更改为
L = sorted(some_iterable)
import
-
检测兄弟导入并将它们转换为相对导入.
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
-
重命名
long
至int
.
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, V
到raise E(V)
和raise E, V, T
至raiseE(V).with_traceback(T)
。如果E
是一个元组,那么翻译将是不正确的,因为在3.0中删除了替换元组的异常.
raw_input
-
转换
raw_input()
到input()
.
reduce
-
处理移动
reduce()
至functools.reduce()
.
reload
-
转换
reload()
到importlib.reload()
.
repr
-
用
repr()
函数替换反引号
set_literal
-
取代使用
set
带有set literals的构造函数。这个fixeris可选.
standarderror
-
Renames
StandardError
toException
.
throw
-
修改生成器中的API更改
throw()
方法
tuple_params
-
删除隐式元组参数解包。此修复程序插入temporaryvariables .
types
-
修复了
types
module.
unicode
-
Renames
unicode
到str
.
urllib
-
删除某些成员的代码,处理了
urllib
的重命名urllib2
到urllib
package.
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
出现时,这个被禁用.
评论被关闭。