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 的等式重载的主要内容,如果未能解决你的问题,请参考以下文章