如何为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
请注意,Python3.6中用于定义类型化namedtuples的新的、基于类的语法在运行时最终要做的基本上是一堆元编程hijinkery来生成一个自定义类,如果您包含自定义的
__add__
方法,那么它恰好也包含了自定义的__add__
方法。在由于Python3.5中没有这种语法,恐怕您真正能做的就是自己实现所有的样板。在
记住,namedtuples基本上是用来定义简单类(即子类元组)的一种方便方法,仅此而已。如果你想要更复杂的东西,你实际上需要自己去实现它。在
至少在我的知识范围内,你做什么都不是最好的。我想一种干净的方法是在定义Point类之后手动修补它,如下所示:
但是,您必须放弃使用mypy,然后mypy会简化(通常也是合理的)假设,即类的属性和类型签名在该类定义之后不会发生更改,因此将不允许为Point分配新方法,并因此在最后一行中抛出错误。在
也许有更聪明的方法(也许用abc模块?)这最终让您、Python运行时和mypy都满意,但我目前还不知道这种方法。在
相关问题 更多 >
编程相关推荐