Подтвердить что ты не робот

Python 2.x возвращает значения для cmp

Цитата из docs:

cmp(x, y)

Сравните два объекта x и y и верните целое число в соответствии с результатом. Возвращаемое значение отрицательно, если x < y, ноль, если x == y и строго положительное, если x > y.

Я был в предположении, что возвращаемые значения всегда -1, 0 и 1, но документы явно не говорят, что упоминание только нулевого и положительного/отрицательного возвращаемого значения.

Есть ли ситуации, когда возвращаемое значение cmp(x,y) не -1, 0 или 1?

4b9b3361

Ответ 1

Нет, документы явно говорят, что yalues ​​может быть чем угодно. Единственное значение, которое указано, равно 0, если сравниваемые объекты равны. Не доверяйте факту, что вы видите только значения -1, 0 и 1, что деталь реализации и может изменить *, поэтому всегда проверяйте < и > 0.

*: note - на самом деле это не будет иметь шанса на изменение, так как cmp ушел в pyhton3. используйте богатое сравнение.

Ответ 2

Можно полагаться только на 0, хотя интересна для docstring для list.sort:

print list.sort.__doc__
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1

Но на самом деле сортировка на самом деле не накладывает это на эту функцию сравнения, как можно увидеть здесь:

def mycmp(a, b):
    print "mycmp(): a - b = ", a - b
    return a - b

L = [50, 30, 20, 40, 70, 50]

>>> L.sort(cmp=mycmp)
mycmp(): a - b =  -20
mycmp(): a - b =  -10
mycmp(): a - b =  20
mycmp(): a - b =  10
mycmp(): a - b =  -10
mycmp(): a - b =  30
mycmp(): a - b =  20
mycmp(): a - b =  10
mycmp(): a - b =  -20
mycmp(): a - b =  0

>>> print L
[20, 30, 40, 50, 50, 70]

Просто для интереса, но ясно, что sort работает счастливо со значениями, отличными от -1, 0 или +1, поэтому вы тоже должны быть!