5

マニュアルには次のように書かれています。

一般に__lt__()__eq__()比較演算子の従来の意味が必要な場合は、これで十分です

しかし、私はエラーが表示されます:

>       assert 2 < three
E       TypeError: unorderable types: int() < IntVar()

このテストを実行すると:

from unittest import TestCase

class IntVar(object):

    def __init__(self, value=None):
        if value is not None: value = int(value)
        self.value = value

    def __int__(self):
        return self.value

    def __lt__(self, other):
        return self.value < other

    def __eq__(self, other):
        return self.value == other

    def __hash__(self):
        return hash(self.value)

class DynamicTest(TestCase):

    def test_lt(self):
        three = IntVar(3)
        assert three < 4
        assert 2 < three
        assert 3 == three

IntVar()右側にある when が__int__()呼び出されていないことに驚いています。私は何を間違っていますか?

追加__gt__()するとこれは修正されますが、注文の最小要件が何であるかを理解していないことを意味します...

ありがとう、アンドリュー

4

1 に答える 1

4

Python 3.x は演算子の型強制を行わ__int__()ないため、このコンテキストでは使用されません。比較

a < b

は最初に を呼び出そうとしtype(a).__lt__(a, b)、これが返さNotImplementedれた場合は を呼び出しますtype(b).__gt__(b, a)

ドキュメントからの引用は、比較を単一の型に対して機能させることに関するものであり、上記の説明は、単一の型に対してこれで十分である理由を示しています。

型を と正しく相互作用させるにはint、すべての比較演算子を実装するか、Python 2.7 または 3.2 で利用可能なtotal_orderingデコレータを使用する必要があります。

于 2012-04-07T13:43:37.783 に答える