Преобразовать Python 2 в Python 3 (с выполнением в стиле Python 2)

#python #python-3.x #python-2.7

#python #python-3.x #python-2.7

Вопрос:

У меня есть код на Python 2, который я хотел бы преобразовать в Python 3, однако поведение кода ДОЛЖНО оставаться точно таким же, как в интерпретаторе Python 2.

Особенно разделение должно вести себя как в интерпретаторе Python 2.

Я пробовал с futurize этапами 1 и 2, но разделение остается только / в коде, который генерирует ошибки при выполнении, потому что возвращаемое число имеет тип float вместо type int (что было поведением по умолчанию для кода, выполняемого в интерпретаторе Python 2).

РЕДАКТИРОВАТЬ: 3 // 2 = 1.0 который есть float в Python 3. Есть ли способ вернуть int ?

Ответ №1:

Futurize / Modernize / 2to3 не может статически анализировать, какие деления являются целочисленными.

Вам нужно будет вручную выполнить операции деления в преобразованном коде и выяснить, какие следует использовать // для целочисленного деления, а какие следует использовать / для реального деления.

Естественно, тестовые примеры вашей кодовой базы должны обнаружить здесь какие-либо регрессии. 😉

Комментарии:

1. Но если все подразделения Python 2 с / являются type int — должен быть futurize флаг, чтобы изменить все это / на // . По крайней мере, на свой страх и риск.

2. Тогда вы должны иметь возможность просто выполнять поиск и замену для ` / ` -> ` // ` ( стараясь не изменять ничего, что могло бы быть в строковых литералах или аналогичных, конечно).

3. вот почему я прошу — не преобразовывать строки с помощью простой замены. У меня более 100 / совпадений в 11 файлах, и я уверен, что хочу изменить все / div на // .

4. Что ж, если это поможет, функция поиска и замены PyCharm имеет фильтр для «За исключением комментариев и строковых литералов» 🙂

5. что ж, это может быть полезно, но я не могу поверить, что нет способа сделать это (на свой страх и риск) с помощью Futurize / Modernize / 2to3.

Ответ №2:

Оператор целочисленного деления есть // в Python 3.

 >>> 3 / 2
1.5
>>> 3 // 2
1
  

Редактировать:
Единственный известный мне способ добиться совместимого поведения от обеих версий python — это футуристизировать / операцию python 2 и преобразовать любые экземпляры, которые ожидают целочисленного деления в программе python 2, вместо этого использовать // который работает для целочисленных делений как в python 2, так и в 3.

Комментарии:

1. спасибо 😉 Но как я могу принудительно futurize изменить все эти разделения? Потому что, если я просто заменю / на // , это может привести к другим ошибкам

2. если вы хотите, чтобы код был совместим как с python 2, так и с 3, я бы вместо этого использовал операцию python 3 для / . Вы можете усовершенствовать деление в программе Python 2 и обновить экземпляры, в которых вам нужно использовать целочисленное деление // , которое также выполняет целочисленное деление в python 2

3. 3 // 2 = 1.0 что float . Есть ли способ вернуть int ?

4. @Ziemo: 3 // 2 => 1 в Python 3 (тип результата int )