【问题标题】:overriding __cmp__ python function覆盖 __cmp__ python 函数
【发布时间】:2012-10-06 05:06:06
【问题描述】:

嗨,我正在覆盖 __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.

谁能给我解释一下:

  • 什么是返回值?
  • 当比较符号改变时,它如何决定是返回True还是False

【问题讨论】:

  • 类 someClass(): def __cmp__(self, obj):
  • 好的,让我编辑问题代码以避免任何混淆
  • 无论您看到什么错误,您的比较方法都不会返回 true。这意味着您的比较函数没有定义严格的顺序。
  • 你确定test_function属于someClass吗?
  • test_function 写在单独的测试文件中

标签: python


【解决方案1】:

__cmp__ 的约定是:

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

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

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

另见:__lt__ instead of __cmp__ http://docs.python.org/reference/datamodel.html#object.__cmp__

【讨论】:

  • 如果两个对象以相反的方式传递,它们应该比较相反。否则 Python 对订单所做的一些假设是无效的。
【解决方案2】:

如果您查看python documentation,您会看到cmp 函数在self &lt; other 时返回-1

由于__cmp__(obj, None) == -1,它假设obj &lt; None

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

【讨论】:

  • 抱歉没用。我的问题是根据我们得出的结论,即 (obj1 None) 将得到 False。
【解决方案3】:

objNone时,你的程序会返回-1,而返回负整数意味着self &lt; obj,所以obj1 &lt; NoneTrueobj1 &gt; Nonefalse

【讨论】:

  • 我不明白你是如何得出 obj1 > None 为假的结论的。
  • @PrashantKumar,实际上python并不关心运算符是什么,它只是计算cmp(obj1,None)并查看将返回什么值,在你的情况下,该值为-1,所以解释器告诉obj1 &gt; None 是假的。
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2021-12-12
  • 2023-03-06
相关资源
最近更新 更多