из вики Python: In Py3.0, the cmp parameter was removed entirely (as part of a larger effort to simplify and unify the language, eliminating the conflict between rich comparisons and the __cmp__ methods).
Я не понимаю, почему cmp удален в py3.0
рассмотрим этот пример:
>>> def numeric_compare(x, y):
return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]
а теперь рассмотрим эту версию (рекомендуется и совместима с 3.0):
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K(object):
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
return K
>>> sorted([5, 2, 4, 1, 3], key=cmp_to_key(reverse_numeric))
[5, 4, 3, 2, 1]
Последнее очень многословно, а в первом та же цель достигается всего одной строкой. С другой стороны, я пишу свой собственный класс, для которого я хочу написать метод __cmp__
. из моего небольшого чтения в Интернете рекомендуется писать __lt__,__gt__,__eq__,__le__,__ge__,__ne__ and not __cmp__
Опять же, почему эта рекомендация? не могу ли я просто определить, что __cmp__
делает жизнь проще?
__cmp__
для сравнения классов и аргументе ключевого словаcmp
для функций сортировки для настройки сортировки. Конечно, они не совсем не связаны, но это ни в коем случае не одно и то же. Когда вы пишете функциюcmp
, которая сравнивает ваши объекты, ей все равно, использует ли она для этого__cmp__
или__lt__
; когда вы пишете функциюkey
, которая создает ключевые значения для ваших объектов, ей все равно, использует ли она для этого__cmp__
или__lt__
(или ни то, ни другое). Итак, какой из двух вопросов вы задаете? - person abarnert   schedule 26.11.2013cmp
. функция, также удаленная в 3.x.) - person abarnert   schedule 26.11.2013__cmp__
никогда не вызывается, нет параметраcmp
ни в одной из функций, связанных с сортировкой, и нет встроенной функцииcmp
. - person abarnert   schedule 26.11.2013