5

What is the most natural way to complete the following code?

import functools

@functools.total_ordering
class X:
    def __init__(self, a):
        self._a = a

    def __eq__(self, other):
        if not isinstance(other, X):
            return False
        return self._a == other._a

    def __lt__(self, other):
        if not isinstance(other, X):
            return ...                    // what should go here?
        return self._a < other._a

if __name__ == '__main__':
    s = [2, 'foo', X(2)]
    s.sort()
    print s
4

2 に答える 2

3

私の個人的なアプローチ:

例外。

異なるタイプの間に自然な順序はありません。

公式のもの:(これを選択してください、あるはずです)

私はそれに完全に同意するわけではありませんが、マニュアルにはそれをどのように行うべきかが明確に記載されています。

http://docs.python.org/library/stdtypes.html#comparisons

異なる数値型と異なる文字列型を除いて、異なる型のオブジェクトが等しく比較されることはありません。そのようなオブジェクトは一貫して任意に並べ替えられます (異種配列を並べ替えても一貫した結果が得られるようにするため)。さらに、一部の型 (たとえば、ファイル オブジェクト) は、その型の 2 つのオブジェクトが等しくない比較の縮退概念のみをサポートします。繰り返しますが、このようなオブジェクトは任意ですが一貫して順序付けられます。<、<=、>、および >= 演算子は、オペランドが複素数の場合に TypeError 例外を発生させます。

基本的に...私は例外を発生させますが、注文を行う最もpythonicな方法は、マニュアルに従うことです。

それを行う明白な方法が 1 つ (できれば 1 つだけ) ある必要があります。

于 2012-08-07T12:06:06.640 に答える
3

自分にとって自然に感じるものは何でも選択できます。Falseインスタンスは常に他のタイプの後Trueにソートされ、前にソートされることを意味します。

または、( およびその他の比較メソッドのドキュメントNotImplementedを参照)を返して、比較がサポートされていないことを通知することもできます。__lt__

def __lt__(self, other):
    if not isinstance(other, X):
        return NotImplemented
    return self._a < other._a

ドキュメントの引用:

NotImplemented豊富な比較メソッドは、指定された引数のペアの操作を実装していない場合、シングルトンを返すことがあります。慣例により、比較が成功した場合はFalseとが返されます。Trueただし、これらのメソッドは任意の値を返すことができるため、比較演算子がブール コンテキスト (if ステートメントの条件など) で使用されている場合、Python はbool()その値を呼び出して、結果が true か false かを判断します。

于 2012-08-07T12:06:37.320 に答える