为什么NotImplemented没有引发TypeError?

时间:2012-11-22 15:59:44

标签: python python-3.x comparison-operators

假设我定义了一个类A,我不希望任何人在不离开的情况下写出该类的不等式。

class A():
    def __ne__(self, other):
        return NotImplemented
print(A() != A())

但这打印出True并且没有提出TypeError虽然我故意“关闭”!=运营商?

2 个答案:

答案 0 :(得分:8)

如果NotImplemented返回__ne__True,则表示您知道时,表示您

通常,Python会交换操作数;如果False导致a != b,则会尝试NotImplemented。这也会失败,因为你在运营商的两边使用相同的类型。对于b != a运算符,Python将回退到比较它们的内存地址,这些不一样(两个单独的实例),因此返回False。

请参阅do_richcompare C function for details

如果这是您的预期结果,则必须手动提升!=

答案 1 :(得分:-2)

它给你True,因为你返回例外,而不是提升它。这意味着您将返回一个非Null对象(异常)作为测试结果。除非另有说明,否则将非Null对象评估为True。 请记住,异常是一个普通的对象,直到你提出它为止。

所以你应该有一个这样的方法:

class A():
    def __ne__(self, other):
        raise NotImplementedError