Python-2to3: безопасный набор исправлений для Python 2 и 3 - PullRequest
0 голосов
/ 16 мая 2019

Какое подмножество исправителей Python 2to3 выводит действительный код Python 2?

Вместо того, чтобы переходить на Python 3 одновременно, я бы хотел использовать 2to3, чтобы пройти большую часть пути, сохранив действительно волосатые вещи (например, изменения в Юникоде) на более позднее время или, возможно, six для поддерживать оба. Я бы хотел, чтобы начальный проход был выполнен 2to3, но я хочу, чтобы он генерировал действительный код Python 2 в качестве промежуточного шага.

Примечание. Мне известен аналогичный вопрос , но на него не было ответа.

1 Ответ

0 голосов
/ 16 мая 2019

Я не думаю, что вы найдете его.Вместо этого лучше всего использовать #!синтаксис, чтобы указать, какой 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 в одном модуле.

Мой вариант использования был относительно простым. аналогичный вопрос , на который вы ссылаетесь, указывает на главу «Погружение в Python» «Портирование кода на Python 3 с 2to3» , которая показывает, насколько разные вещи, большая часть которых составляет несовместимо отличается, требуя много условного кодирования, как указано выше.Я не рекомендовал бы это.

...