python のソート関数が key を要求してくる件について

今の仕事でメインに使ってる言語は Kotlin なのだけど、Excel のワークブックからデータを読み取ってくるような用途には python が使われてる。
そこで python でソートしたかったのだけど、組み込みの sorted() 関数の引数が key となっていて、「これだな」と思った cmp は deprecated だった。

同じ状況の人へのサクッとした解決策としては key に functools.cmp_to_key(your_cmp_func) のような感じで指定すればおk

 

import functools

def compare_as_see_fit(lhs, rhs):
    if lhs > rhs:
        return 1
    elif lhs < rhs:
        return -1
    return 0

print(sorted([65535, 7, 255, 7, 31], key=functools.cmp_to_key(compare_as_see_fit)))

 

もうこれだけで it works! なのだけど、この functools.cmp_to_key() クンが何をどうしてくれてるのかイメージできなかった。

ほな、ソースみよか?

 

# Copyright (C) 2006-2013 Python Software Foundation.

def cmp_to_key(mycmp):
    """Convert a cmp= function into a key= function"""
    class K(object):
        __slots__ = ['obj']
        def __init__(self, obj):
            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
        __hash__ = None
    return K

 

あ、あ、そういう事ね!!

自分が勝手に「絶対値に変換してからソート関数に渡せ」って意味に勘違いしてただけで、比較可能ならそれでいいのね!!
そもそも key っていう引数の意味自体を勘違いしてたわ。
要素の絶対値を求める関数だと思ってた!!
型を明示しない言語だとそういう部分を正確に読み取るの難しいよね。