46

この関数hereに出会いました。

これがどのように実装されるかについて私は困惑しています-keyによって生成された関数はcmp_to_key、特定の要素が他のすべての対象要素とどのように比較されるかをチェックせずに、特定の要素がどの「位置」であるべきかをどのように知るのでしょうか?

4

1 に答える 1

63

このcmp_to_keyメソッドは、代理キーとして機能する特別なオブジェクトを返します。

class K(object):
    __slots__ = ['obj']
    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
    def __hash__(self):
        raise TypeError('hash not implemented')

並べ替えると、各キーがシーケンス内の他のほとんどのキーと比較されます。位置 0 にあるこの要素は、他のオブジェクトよりも低いか大きいか?

これが発生するたびに、特別なメソッド フックが呼び出されます。つまり、__lt__or__gt__が呼び出され、代わりに代理キーがメソッドの呼び出しに変わりますcmp

したがって、リスト[1, 2, 3]は としてソートされ[K(1), K(2), K(3)]、たとえば、K(1)が と比較されてが小さいK(2)かどうかを確認すると、 が呼び出され、これが に変換されます。K(1)K(1).__lt__(K(2))mycmp(1, 2) < 0

とにかく、これは古いcmp方法がどのように機能していたかです。最初の引数が 2 番目の引数より小さいか、等しいか、大きいかに応じて、-1、0、または 1 を返します。代理キーは、これらの数値を比較演算子のブール値に変換します。

代理キーは、絶対位置について何も知る必要はありません。比較対象の他の1 つのオブジェクトについて知る必要があるだけで、特別なメソッド フックがその他のオブジェクトを提供します。

于 2013-05-03T15:44:27.470 に答える