【问题标题】:Python-2to3: Safe Set of Fixers for Python 2 and 3Python-2to3:Python 2 和 3 的安全修复程序集
【发布时间】:2023-03-10 01:06:01
【问题描述】:

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

与其一次性全部迁移到 Python 3,我更愿意使用 2to3 来完成大部分工作,将真正麻烦的东西(例如 unicode 更改)保存到以后,或者可能使用 six 来支持两者。我希望2to3 完成初始传递,但我希望它生成有效的 Python 2 代码作为中间步骤。

注意:我知道a similar question,但并没有真正得到答复。

【问题讨论】:

    标签: python python-2to3


    【解决方案1】:

    我最近发现了一个工具futurize 可以为您完成这项工作。在 EPEL 中甚至还有 CentOS 6 的 RPM(我在工作中的某些机器上一直使用它)——它是 python-future

    http://python-future.org/automatic_conversion.html - 阶段 1 是“为 python 3 做准备,同时保持与库存包的兼容性”。我发现第 2 阶段需要与它一起安装的其他软件包,但在我复制脚本时在其他机器上不可用。

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

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

    【讨论】:

      【解决方案2】:

      我不认为你会找到一个。您最好的方法是使用 #!语法来指示您想要使用的 Python 并使用 2to3,因为您已准备好使用每个 Python。 (如果您使用的是 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,它显示了有多少不同的东西,其中大部分是不兼容不同的,需要大量的条件编码,如上所述。我不会推荐它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多