为什么cmp参数在Python3.0中从sort / sorted中移除了?

7 浏览
0 Comments

为什么cmp参数在Python3.0中从sort / sorted中移除了?

Python维基中:

在Python 3.0中,完全删除了cmp参数(作为简化和统一语言的更大努力的一部分,消除了富比较和__cmp__方法之间的冲突)。

我不理解为什么在py3.0中删除了cmp的理由。

考虑以下示例:

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):

'将cmp=函数转换为key=函数'

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__而不是__cmp__。

再次问一下,为什么有这个建议?我不能只定义__cmp__以简化生活吗?

0