我有一个函数,可以合并int或str的两个列表.

它由以下代码定义:

AddableList = ...


def add_arrays(array: AddableList, array2: AddableList) -> AddableList:
    if len(array) != len(array2):
        raise ValueError

    return [a + b for a, b in zip(array, array2)]

键入AddableList时,使用List[int]

键入AddableList时,使用List[str]

但是,mypy将返回以下错误

error: Unsupported operand types for + ("int" and "str")
error: Unsupported operand types for + ("str" and "int")
note: Both left and right operands are unions
Found 2 errors in 1 file (checked 333 source files)

正确键入时,列表中有AddableList = List[Union[int, str]]

最后,当try 键入AddableListUnion[List[int], List[str]]时,mypy错误为:

error: Unsupported left operand type for + ("object")

我应该使用什么类型来解决此问题?

推荐答案

使用将解析为一种类型或另一种类型(但不能在同一上下文中同时解析为两种类型)的TypeVar:

from typing import List, TypeVar

Addable = TypeVar("Addable", str, int)


def add_arrays(array: List[Addable], array2: List[Addable]) -> List[Addable]:
    if len(array) != len(array2):
        raise ValueError

    return [a + b for a, b in zip(array, array2)]

reveal_type(add_arrays([1, 2, 3], [2, 3, 4]))    # List[int]
reveal_type(add_arrays(["a", "b"], ["c", "d"]))  # List[str]
reveal_type(add_arrays([1, 2, 3], ["a", "b", "c"]))  # error

最后一行抛出错误,因为没有Addable可以解析的类型:

test.py:14: error: Cannot infer type argument 1 of "add_arrays"

Python相关问答推荐

如何将Pydantic URL验证限制为特定主机或网站

如何使用函数正确索引收件箱?

根据多列和一些条件创建新列

我可以使用极点优化这个面向cpu的pandas代码吗?

Matplotlib轮廓线值似乎不对劲

过载功能是否包含Support Int而不是Support Int?

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

线性模型PanelOLS和statmodels OLS之间的区别

大Pandas 胚胎中产生组合

将特定列信息移动到当前行下的新行

按列分区,按另一列排序

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

用Python解密Java加密文件

通过pandas向每个非空单元格添加子字符串

如何在python polars中停止otherate(),当使用when()表达式时?

对所有子图应用相同的轴格式

如何获取numpy数组的特定索引值?

在pandas/python中计数嵌套类别

ConversationalRetrivalChain引发键错误

为什么在FastAPI中创建与数据库的连接时需要使用生成器?