比較関係 (=、≠、<、>、≤、および ≥) 間の次の数学的関係は常に有効であるため、デフォルトで 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 で実装されます。