2to3 не разрешает .sort() в sorted()

#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.