在Python 3.1中使用Duck键入排序的最小方法

时间:2012-04-07 13:35:22

标签: python python-3.x duck-typing

the manual中说:

  

一般来说,__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()位于右侧时,__int__()未被调用。我做错了什么?

添加__gt__()修复此问题,但意味着我不明白订购的最低要求是什么......

谢谢, 安德鲁

1 个答案:

答案 0 :(得分: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 decorator