#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 с
/
являются typeint
— должен быть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 23.
3 // 2 = 1.0
чтоfloat
. Есть ли способ вернутьint
?4. @Ziemo:
3 // 2
=>1
в Python 3 (тип результатаint
)