Python 2to3修复器的哪个子集输出有效的Python 2代码?
与其一下子迁移到Python3,我更愿意使用2to3来完成大部分工作,将真正复杂的东西(例如,unicode更改)保存到以后,或者可能使用six来支持这两种方式。我希望由2to3完成初始遍历,但我希望它生成有效的Python2代码作为中间步骤。
注意:我知道a similar question,但它并没有得到真正的响应。
发布于 2019-11-13 09:35:27
我最近发现了一个工具futurize,它可以为您做这件事。在EPEL中,甚至有一个适用于CentOS 6的转速(我在工作中的一些机器上坚持使用它)-它是python-future。
http://python-future.org/automatic_conversion.html -Stage1是“为Python3做准备,同时保持与现有包的兼容性”。我发现阶段2需要安装的其他包,但当我复制脚本时,这些包在其他机器上不可用。
一个例子:futurize -l -f all -f idioms -f ws_comma -x long *py
添加-w将为您写回更改。
发布于 2019-05-16 11:11:05
我不认为你会找到一个。你最好的方法是使用#!语法来指示您想要使用的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指向深入研究Python "Porting Code to Python 3 with 2to3" chapter,它显示了许多东西是不同的,其中许多内容是不兼容的,需要进行大量如上所述的条件编码。我不建议你这么做。
https://stackoverflow.com/questions/56157854
复制相似问题