#python #python-3.x #python-2.7 #python-2to3
#python #python-3.x #python-2.7 #python-2to3
Вопрос:
Я пытаюсь преобразовать библиотеку из Py 2.7.x в Py 3.7.x, используя 2to3 на Win10. Следующая ссылка отсюда.
Я видел, что для преобразования некоторых частей Python вам нужно явно добавить средства исправления, в частности:
идиомы
Это необязательное средство исправления выполняет несколько преобразований, которые делают код Python более идиоматичным. Сравнения типов, такие как type(x) is SomeClass и type(x) == SomeClass, преобразуются в isinstance(x, SomeClass). в то время как 1 становится while True . Этот исправитель также пытается использовать sorted() в соответствующих местах. Например, этот блок
L = список(some_iterable) L.sort() изменен на
L = sorted(some_iterable)
Поэтому я добавляю его в свою командную строку:
2to3 --output-dir=C:mypy3module -f all -f buffer -f idioms -f set_literal -f ws_comma -W -n C:mypy2module
2to3 сгенерирует правильные файлы в C:mypy3module папка, но list.sort() не была преобразована в sorted(список)
Что я здесь упускаю из виду?
Комментарии:
1.
list.sort()
это все еще вещь — он сортирует список на месте.sorted(..)
создает новый отсортированный список и возвращает его ..
Ответ №1:
Похоже, что исправление буквально работает только для
x = list(z)
x.sort()
шаблон, а не что-то более причудливое. В конце концов, 2to3 не выполняет анализ типов.
Ответ №2:
Результат попытки конвертировать библиотеку с github в 3 часа ночи. Реальная проблема заключается в изменениях между возвращаемым значением dictionary .keys() между Py2 и Py3.
Фрагмент из библиотеки, который я просматривал 2to3:
keys = timeSamples.keys()
keys.sort()
Который я изменил на:
keys = sorted(timeSamples.keys())
Если бы я действительно прочитал сообщение об ошибке, я бы увидел, что пытался вызвать .sort() на dict_keys, а не список в Py3.