python - Python 中的“反向”比较运算符

标签 python comparison

class Inner():

    def __init__(self, x):
        self.x = x

    def __eq__(self, other):
        if isinstance(other, Inner):
            return self.x == other.x
        else:
            raise TypeError("Incorrect type to compare")

class Outer():

    def __init__(self, y):
        self.y = Inner(y)

    def __eq__(self, other):
        if isinstance(other, Outer):
            return self.y == other.y
        elif isinstance(other, Inner):
            return self.y == other
        else:
            raise TypeError("Incorrect type to compare")


if __name__ == "__main__":

    a = Outer(1)
    b = Inner(1)

    print(a == b) # ok no problem
    print(b == a) # This will raise a type error

在示例中,我有内部类和外部类。我无法控制 Inner 的实现,只是想模拟这种情况。我只能控制 Outer 的行为。我希望外部实例能够与内部实例进行比较(不仅仅是相等)。对于给定的实现,只有第一个比较有效,因为调用 Outer 的 __eq__ 方法允许与 Outer 和 Inner 实例进行比较,但第二个比较调用 Inner 的 __eq__ 方法不会允许与 Outer 进行比较——它不知道 Outer 存在为什么要费心去实现它。 有没有办法让第二种类型的比较工作,使用类似 __radd__ 和这样的功能。 例如,我知道在 C++ 中你可以使用内联运算符定义来解决这个问题,但我们在 Python 中没有这样的定义。

最佳答案

不过分强调:Inner.__eq__ 已损坏。至少,与其抛出错误,不如抛出错误 return NotImplemented ,这将允许 Python 尝试反向比较:

When NotImplemented is returned, the interpreter will then try the reflected operation on the other type, or some other fallback, depending on the operator. If all attempted operations return NotImplemented, the interpreter will raise an appropriate exception.

更好的是它会使用 "duck typing" ,而不是坚持特定的类(除非类而不是它的接口(interface)是比较中明确重要的部分):

def __eq__(self, other):
    try:
        return self.x == other.x
    except AttributeError:
        return NotImplemented

但是,正如您所说您无法控制它,您将不得不手动实现类似的功能,例如:

def compare(a, b):
    """'Safe' comparison between two objects."""
    try:
        return a == b
    except TypeError:
        return b == a

因为在 Python's data model 中没有 __req__ 这样的东西.

关于python - Python 中的“反向”比较运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38434094/

相关文章:

python - 如何将列表中的字符串用作 python 中的字符串方法?

java - ASP.NET MVC 与 Spring MVC

linux - AWK 比较两个单独文件中的两列

python - 绘制 Pandas 数据框的多行

python - Matplotlib 无处不在地绘制未定义的图

python - django 身份验证注销功能是否删除 django_session 表中的 session 行?

python - Mandelbrot 序列与 Python 的 Turtle

python - 将附加列添加到 panda 数据框中比较两列

css - 您认为最好的 CSS 网格系统是什么?为什么?

JavaScript 比较数组在不应该失败的时候失败