この関数hereに出会いました。
これがどのように実装されるかについて私は困惑しています-key
によって生成された関数はcmp_to_key
、特定の要素が他のすべての対象要素とどのように比較されるかをチェックせずに、特定の要素がどの「位置」であるべきかをどのように知るのでしょうか?
この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 つのオブジェクトについて知る必要があるだけで、特別なメソッド フックがその他のオブジェクトを提供します。