namedtuple 的等式重载

Posted

技术标签:

【中文标题】namedtuple 的等式重载【英文标题】:Equality overloading for namedtuple 【发布时间】:2016-04-06 20:45:59 【问题描述】:

有没有办法在 python 中为 namedtuple 重载相等运算符 __eq__(self, other)

我知道这在类和重新定义方法中是可能的,但对于 namedtuple 也可能,您将如何实现它?

【问题讨论】:

【参考方案1】:

我认为,鉴于 namedtuple 的公共 API,如果不覆盖,就不可能做到这一点。最短的解决方案是:

class Person(namedtuple('Person', ['ssn', 'name'])):
    def __eq__(self, other):
        return self.ssn == other.ssn

--

>>> p1 = Person("123", "Ozgur")
>>> p2 = Person("123", "EVR")
>>> print p1 == p2
True

另一种选择是:

>>> Person = namedtuple('Person', ['ssn', 'name'])
>>> Person.__eq__ = lambda x, y: x.ssn == y.ssn

【讨论】:

【参考方案2】:

据我所知,您无法修补 __eq__,但您可以继承 namedtuple 并按照您的喜好实现它。例如:

from collections import namedtuple

class Demo(namedtuple('Demo', 'foo')):

    def __eq__(self, other):
        return self.foo == other.foo

使用中:

>>> d1 = Demo(1)
>>> d2 = Demo(1)
>>> d1 is d2
False
>>> d1 == d2
True

【讨论】:

【参考方案3】:

通过键入新的 Namedtuple 类是可能的。它适用于 python 3.6,但也适用于以前的示例。

例如:

from typing import NamedTuple

class A(NamedTuple):
    x:str
    y:str
    def __eq__(self,other):
        return self.x == other.x

print(A('a','b') == A('a','c'))

【讨论】:

以上是关于namedtuple 的等式重载的主要内容,如果未能解决你的问题,请参考以下文章

namedtuple工厂函数精讲

python 简单了解namedtuple

Python的namedtuple使用详解

python中namedtuple介绍

collections模块学习之namedtuple

关于Python3的namedtuple问题