回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>来自<a href="https://wiki.python.org/moin/HowTo/Sorting/#The_Old_Way_Using_the_cmp_Parameter">python wiki</a>:
<code>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).</code></p>
<p>我不明白为什么在py3.0中删除了cmp</p>
<p>举个例子:</p>
<pre><code>>>> def numeric_compare(x, y):
return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]
</code></pre>
<p>现在考虑这个版本(推荐并与3.0兼容):</p>
<pre><code>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]
</code></pre>
<p>后者是非常冗长的,同样的目的是在前者只需一行。另一个注意事项是,我正在编写要为其编写<code>__cmp__</code>方法的自定义类。从我在网上的阅读来看,建议写<code>__lt__,__gt__,__eq__,__le__,__ge__,__ne__ and not __cmp__</code>
再说一遍,为什么要这样推荐?我能不能不定义<code>__cmp__</code>让生活更简单?</p>