オブジェクトがsortableかどうかを知りたい場合は、必要な比較方法が実装されているかどうかを確認する必要があります。
Python 2.Xでは、これらのメソッドを実装する 2 つの異なる方法がありました。
cmp メソッド (例ごとの Java の compareTo に相当)
__cmp__(self, other)
: 自分自身が他の値より大きいか、等しいか、または小さいかにかかわらず、>0、0、または <0 を返します。
豊富な比較方法
__lt__, __gt__, __eq__, __le__, __ge__, __ne__
sort() 関数は、このメソッドを呼び出して、インスタンス間で必要な比較を行います (実際には sort には__lt__
または__gt__
メソッドのみが必要ですが、それらすべてを実装することをお勧めします)。
Python 3.Xでは__cmp__
、同じことを行う方法が複数あることは実際には Python の「法則」に反するため、豊富な比較方法を優先してが削除されました。
したがって、基本的に、これらのメソッドがクラスによって実装されているかどうかを確認する関数が必要です。
# Python 2.X
def is_sortable(obj):
return hasattr(obj, "__cmp__") or \
hasattr(obj, "__lt__") or \
hasattr(obj, "__gt__")
# Python 3.X
def is_sortable(obj):
cls = obj.__class__
return cls.__lt__ != object.__lt__ or \
cls.__gt__ != object.__gt__
Python 2 と 3 では異なる関数が必要です。これは、Python 3 では、バインドされていないメソッド、メソッド ラッパー、およびその他の内部的なものについても多くの変更が加えられているためです。
Python でソート可能なオブジェクトをよりよく理解したい場合は、次のリンクをお読みください。
PS:これは私の最初の回答を完全に再編集したものですが、問題をよりよく調査し、それについてより明確な考えを持っていたので必要でした:)