私はnamedtupleクラスをよく使います。私は今日、そのようなクラスにカスタムソートを実装する良い方法があるかどうかを考えていました。つまり、デフォルトのソートキーをnamedtupleの最初の要素(次に2番目、3番目など)ではなくします。
私の最初の本能は、実装__lt__
して残り__eq__
を任せるtotal_ordering
ことでした(le、ne、gt、geに記入します):
from collections import namedtuple
from functools import total_ordering
@total_ordering
class B(namedtuple('B', 'x y')):
def __lt__(self, other):
return self.y < other.y
でも:
def test_sortingB():
b1 = B(1, 2)
b2 = B(2, 1)
assert b2 < b1 # passes
assert b2 <= b1 # fails
ああ、そうです...他のメソッドが欠落している場合にtotal_ordering
のみ記入します。tuple/namedtuple にはそのようなメソッドがあるため、total_ordering は何もしていません。
だから私は私のオプションは
- namedtuple の使用をやめて、退屈なクラスを独自に作成し、total_ordering を使用し続けます
- namedtuple を使い続け、6 つの比較メソッドすべてを実装する
- namedtuple を使用し続け、ソート値を最初のフィールドとして挿入します。幸いなことに、クラスのインスタンスはそれほど多くありませんが、通常はフィールドの順序に依存してフィールドを初期化するだけなので、面倒な場合があります。たぶんそれは悪い習慣です。
これを解決するための最良の方法に関する提案はありますか?