-3

比較関係 (=、≠、<、>、≤、および ≥) 間の次の数学的関係は常に有効であるため、デフォルトで Python に実装されます (恣意的に見え、この投稿の理由である 2 つの和集合関係を除きます)。

  • 2つの補完関係: 「= と ≠ は互いに補完し合う」;
  • 6関係*: 「= は自分自身の逆」、「≠ は自分自身の逆」、「< と > は互いに逆」、「≤ と ≥ は互いに逆」;
  • 2結合関係: "≤ は < と =" の結合であり、"≥ は > と =" の結合です。

比較関係間の次の関係は、合計注文functools.total_orderingに対してのみ有効であるため、Python ではデフォルトで実装されていません (ただし、Python 標準ライブラリによって提供されるクラス デコレータで有効な場合、ユーザーは便利に実装できます)。

  • 4つの補完関係:「<と≧は互いに補完し合い」、>と≦は互いに補完し合う。

なぜ Python には上記の 2 つの和集合の関係しかないのですか ("≤ は < と =" の和集合であり、"≥ は > と =" の和集合です)。

これらのように、 inとのデフォルト実装、およびin__le__とのデフォルト実装を提供する必要があります(ただし、おそらくパフォーマンスのために C で、 のように):__lt____eq____ge____gt____eq____ne__

def __le__(self, other):
    result_1 = self.__lt__(other)
    result_2 = self.__eq__(other)
    if result_1 is not NotImplemented and result_2 is not NotImplemented:
        return result_1 or result_2
    return NotImplemented

def __ge__(self, other):
    result_1 = self.__gt__(other)
    result_2 = self.__eq__(other)
    if result_1 is not NotImplemented and result_2 is not NotImplemented:
        return result_1 or result_2
    return NotImplemented

2 つのユニオン関係は常に有効であるため、これらの既定の実装により、ユーザーは常にそれらを提供する必要がなくなります (ここのように)。

これは、2つのユニオン関係が現在デフォルトで実装されていないことを明示的に述べているPythonドキュメントの段落です(太字の強調鉱山):

デフォルトでは、 に__ne__()委任し__eq__()、そうでない限り、結果を反転しNotImplementedます。比較演算子の間には、他の暗黙の関係はあり(x<y or x==y)ませんx<=y


* 逆の関係は、NotImplementedプロトコルを通じて Python で実装されます。

4

3 に答える 3