[Python 2to3更新方法] 2to3 vs futurize Python代码转换应使用哪个?


内容

  • [如何更新Python2to3]目录

概述

从2到3系列更新Python时,在2和3系列之间有许多不兼容的部分,因此可能有必要修改代码。
这可能是一个主要障碍,但是有一些有用的工具可以自动为您翻译代码。

在这里,我将比较2to3和futurize,它们似乎易于使用。

2to3和futurize

之间的区别

两者是非常不同的部分,因此本文将仅解释不同之处。
本文的目的是帮助您确定哪种环境最适合您。

每种方法的详细用法如下所述,因此如果需要请参考它。

  • [Python2to3更新] 2to3自动源代码转换
  • [Python2to3更新方法]使用futurize安全地自动进行源代码转换

2to3是什么?

Python的标准模块。
它会自动将2系列的源重写为3系列。
您也可以编写自己的转换程序。

这是一个比将来更简单的工具。

参考:2to3-docs.python.org

futurize

一个基于2to3的模块,可以自动将2系列的源重写为3系列。
与2to3的区别在于,这是与使用2to3的情况不同的实现方式,因为已合并了future模块,因此源代码可以与Python2系列或3系列一起使用。

参考:自动转换为Py2 / 3

2to3和未来

之间的特定区别

中,我们将验证2to3和futurize中实现的内容如何不同。

示例代码

使用以下代码,分别进行2to3转换和futurize,并验证执行结果。
由于以下分割的结果在Python 2系列和3系列之间是不同的,因此当执行以下代码时,0以2系列返回,而0.5以3系列返回。

参考:Python 2系列和3系列之间的区别-关于除法小数点以下的处理

sample.py

1
2
# -*- coding:utf-8 -*-
print(1/2)

在使用2to3进行转换的情况下,为

2to3转换时,其转换如下。 (几乎没有区别)

sample.py

1
2
# -*- coding:utf-8 -*-
print((1/2))

在2个系统中执行转换后的代码

1
2
$ python sample.py
0

在3个系统中执行转换后的代码

1
2
$ python sample.py
0.5

当然,第二和第三系统的执行结果是不同的。

未来翻译时

在进行futurize的stage2中的代码转换时,将其转换为以下实现。

sample.py

1
2
3
4
5
# -*- coding:utf-8 -*-
from __future__ import print_function
from __future__ import division
from past.utils import old_div
print(old_div(1,2))

在2个系统中执行转换后的代码

1
2
$ python sample.py
0

在3个系统中执行转换后的代码

1
2
$ python sample.py
0

实现为无论转换后的代码是在第二系统还是第三系统中执行,都将返回相同的结果。

其他差异

futurize具有阶段性的概念,因此理想的做法是分两步将代码从2个系统更新为3个系统。目标不是分一次更改代码,而是通过分两个阶段执行来避免风险。
另一方面,在2to3中,没有采取步骤的概念。可以说2to3更简单。

有关未来化阶段的详细信息,请参见下文。
参考:有关将来的阶段,请参见

摘要

这样,futurize和2to3不仅在实现细节上有所不同,而且在执行结果以及代码转换的方法和概念上也有所不同。
我认为使用哪种决定取决于环境,因此最好在了解每种工具之间的差异后做出决定。

相关文章

  • [Python2to3更新方法] 2to3自动源代码转换
  • [Python2to3更新方法]使用futurize安全地自动进行源代码转换