如何在NamedTup上重载“+”

2024-09-30 18:29:00 发布

您现在位置:Python中文网/ 问答频道 /正文

如何为3.5中的命名元组创建plus的自定义重载?我知道3.6中有一些新的语法,你能在3.5中做到吗?我也希望它能通过我的检查。在

from typing import NamedTuple


Point = NamedTuple('Point',[('x',int),
                            ('y',int)])

def joinPoints(a: Point, b:Point) -> Point:
    return Point(x = a.x+b.x,y=a.y+b.y)

q = Point(1,2)
r = Point(3,4)
s= joinPoints(q,r)
t = q+r #HOW DO I MAKE THIS GO?
#s should equal t

Tags: fromimporttypingreturndef语法plusnamedtuple
1条回答
网友
1楼 · 发布于 2024-09-30 18:29:00

请注意,Python3.6中用于定义类型化namedtuples的新的、基于类的语法在运行时最终要做的基本上是一堆元编程hijinkery来生成一个自定义类,如果您包含自定义的__add__方法,那么它恰好也包含了自定义的__add__方法。在

由于Python3.5中没有这种语法,恐怕您真正能做的就是自己实现所有的样板。在

记住,namedtuples基本上是用来定义简单类(即子类元组)的一种方便方法,仅此而已。如果你想要更复杂的东西,你实际上需要自己去实现它。在


至少在我的知识范围内,你做什么都不是最好的。我想一种干净的方法是在定义Point类之后手动修补它,如下所示:

from typing import NamedTuple

Point = NamedTuple('Point', [('x', int), ('y', int)])

def add(self: Point, other: Point) -> Point:
    return Point(self.x + other.x, self.y + other.y)

Point.__add__ = add

a = Point(1, 2)
b = Point(3, 4)

print(a + b)  # prints 'Point(4, 6)'

但是,您必须放弃使用mypy,然后mypy会简化(通常也是合理的)假设,即类的属性和类型签名在该类定义之后不会发生更改,因此将不允许为Point分配新方法,并因此在最后一行中抛出错误。在

也许有更聪明的方法(也许用abc模块?)这最终让您、Python运行时和mypy都满意,但我目前还不知道这种方法。在

相关问题 更多 >