#python-3.x #list #version
#python-3.x #Список #версия
Вопрос:
У меня есть следующий код, который выдает ошибку, я не понимаю, почему это происходит, если вы измените пункт «2.0.8» на «2.1.8», ошибка исчезнет. даже если вы измените элемент ‘2.0.8’ на ‘3.1.8’, он будет работать нормально, есть предложения?
from distutils.version import LooseVersion
versions_list = ['2.5.6.RC02', '2.0.8', '2.0-m2']
versions_list.sort(key=LooseVersion, reverse=False)
print(versions_list)
Ошибка типа: ‘<‘ не поддерживается между экземплярами ‘str’ и ‘int’
Ответ №1:
Да. 1-й не имеет значения — последних двух достаточно, чтобы продемонстрировать проблему.
sorted(['2.1.8', '2.1-m2'], key=LooseVersion) # fails
sorted(['8', 'm2'], key=LooseVersion) # fails
Один из способов интерпретации TypeError
— «две версии несопоставимы», то есть
не определено, должна ли одна или другая быть первой.
Мы проводим три сравнения: 2 == 2
, 1 == 1
, и, наконец, нам интересно, как 8
сравнивается с 'm2'
. В последнем случае все разваливается. Обратите внимание, что мы не сравниваем в порядке ASCII, поскольку мы действительно хотим 9 < 11
, а не наоборот. Сравнение целых чисел сильно отличается от сравнения строк. Когда вы настроили его на отображение 0
или 1
в середине, вы закорачивали процедуру сравнения, позволяя ей сообщать ответ перед проверкой всех компонентов.
Если TypeError
для вас недостаточно перехвата и сообщения о «неопределенном», то, полагаю, я бы посоветовал очистить компоненты версии перед их передачей LooseVersion
.
Комментарии:
1. Хорошая уловка, очистка компонентов версии звучит разумно.