Python-2to3:适用于Python 2和3的安全修复程序集

时间:2019-05-15 21:28:08

标签: python python-2to3

Python 2to3修复程序的哪些子集输出有效的Python 2代码?

我不想一次全部使用Python 3,而是想使用2to3来获取大部分信息,稍后保存真正多毛的东西(例如unicode更改),或者可能使用{{1}两者都支持。我希望six完成一次初始传递,但是我希望它生成有效的Python 2代码作为中间步骤。

注意:我知道a similar question,但并未真正回答。

2 个答案:

答案 0 :(得分:1)

我最近找到了一个工具futurize可以为您完成此任务。在EPEL中,甚至还有CentOS 6的RPM(我在工作中的某些机器上一直使用)–它是python-future

http://python-future.org/automatic_conversion.html-阶段1是“与python软件包兼容的python 3的准备”。我发现第2阶段还需要安装其他软件包,但是在复制脚本时其他机器上却没有。

一个例子: futurize -l -f all -f idioms -f ws_comma -x long *py

添加-w将为您写出更改。

答案 1 :(得分:-1)

我认为您不会找到一个。最好的方法是使用#!语法,指示要使用的Python,并在准备好使用每个Python时使用2to3。 (如果您使用的是Windows,请查看Python launcher,以使共存更加容易。)

我写了一个模块,它需要同时使用2和3。而且我的代码看起来像这样:

import sys
PYTHON3 = sys.version_info.major == 3
PYTHON2 = sys.version_info.major == 2

if PYTHON2:
    import StringIO
    stringio = StringIO.StringIO
    bytesio = StringIO.StringIO # In Python2, stringIO takes strings of binary data
    import urllib2
    URL_open = urllib2.urlopen
    HTTPError = urllib2.HTTPError

if PYTHON3:
    import io
    stringio = io.StringIO
    bytesio  = io.BytesIO # In Python3, use BytesIO for binary data
    import urllib.request
    URL_open = urllib.request.urlopen
    import urllib.error
    HTTPError = urllib.error.HTTPError

分散在诸如以下的地方:

if PYTHON2:
    f = stringio(self.XMLData)
if PYTHON3:
    f = bytesio(self.XMLData.encode(encoding="utf-8"))

这不是一种表达在两种系统中都可以使用的行的方式。您需要进行很多这样的修补。除非您有一个用例(像这样),否则出于某些原因必须在一个模块中同时支持Python2和Python3,这确实不值得。

我的用例相对简单。您所指的similar question指向Dive Into Python "Porting Code to Python 3 with 2to3" chapter,它显示了多少不同之处,其中许多是不兼容的不同,需要大量的条件编码,例如以上。我不推荐。