在 python 中,两个序列的连接通常由+操作符完成。但是,mypy 抱怨以下内容:
from typing import Sequence
def concat1(a: Sequence, b: Sequence) -> Sequence:
return a + b
Run Code Online (Sandbox Code Playgroud)
没错:Sequence没有__add__. 但是,该函数对于“通常的”序列类型list, str,工作得非常好tuple。显然,还有其他序列类型不起作用(例如numpy.ndarray)。解决方案可能是以下内容:
from itertools import chain
def concat2(a: Sequence, b: Sequence) -> Sequence:
return list(chain(a, b))
Run Code Online (Sandbox Code Playgroud)
现在,mypy 没有抱怨。但是连接字符串或元组总是给出一个列表。似乎有一个简单的解决方法:
def concat3(a: Sequence, b: Sequence) -> Sequence:
T = type(a)
return T(chain(a, b))
Run Code Online (Sandbox Code Playgroud)
但是现在 mypy 不高兴了,因为 T get 的构造函数参数太多。更糟糕的是,该函数不再返回序列,而是返回一个生成器。
这样做的正确方法是什么?我觉得问题的一部分是 a 和 b 应该具有相同的类型,并且输出也将是相同的类型,但是类型注释并没有传达它。
注意:我知道使用''.join(a, b). 但是,我选择这个例子更多是为了说明目的。