3

嗨,我是压倒一切__cmp__的。如果传递的第二个对象是None,或者不是 的实例someClass,则返回-1

我不明白这里到底发生了什么。

class someClass():
    def __cmp__(self, obj):
        if obj == None:
            return -1
        if not isinstance(obj, someClass):
            return -1  

我的测试功能:

def test_function(self):  
        obj1 = someClass()
        self.assertTrue(obj1 < None)
        # I get true.
        self.assertTrue(obj1 > None)
        # I get failure as False is returned.

谁能给我解释一下:

  • 返回值是多少?
  • 它如何决定是否会返回TrueFalse何时更改比较符号?
4

3 回答 3

8

的约定__cmp__是:

a < b : return -1
a = b : return 0
a > b : return 1

a这当然只有在两者和b都是兼容类型时才有意义,比如数字。如果您有“极端情况”,其中aorb为 None 或不兼容 ( not instanceof),您应该报告错误,因为这是在您的实例上使用比较运算符时出现的编程错误。someClass

可以用 实现任何行为__cmp__,但是与 OP 描述的方式比较 None 最终会导致奇怪的行为和错误。

另见:__lt__ 而不是 __cmp__ http://docs.python.org/reference/datamodel.html#object.__cmp__

于 2012-10-16T06:58:21.550 回答
3

objisNone时,您的程序将返回 -1,而返回负整数意味着self < obj、 so obj1 < NoneisTrueobj1 > Noneis false

于 2012-10-16T06:59:50.370 回答
1

如果您查看 python文档,您会看到该cmp函数返回-1if self < other

因为__cmp__(obj, None) == -1,它假设obj < None

我的猜测是否__cmp__(obj, None)应该返回1,因为任何对象都优于没有对象:)

于 2012-10-16T06:58:29.897 回答