首页 > 解决方案 > 通用列表联盟没有按我期望的方式工作

问题描述

所以我有一个函数,它接受一个 obj 列表或一个 obj 并返回一个列表。

这是它的样子:

from typing import Union, List, TypeVar, Type

T = TypeVar('T')


def to_list(obj_type: Type[T], obj_or_list: Union[List[T], T]) -> List[T]:
    ...

如果我传入一个 str ,这很好用。例如

result: List[str] = to_list(str, "hi")

但是当我传入 str 列表(或任何对象的列表)时失败(通过 pyright 进行类型检查错误),例如

input_data: List[str] = ["hi"]
result: List[str] = to_list(str,input_data)

这是错误消息

“List[str | List[str]]”类型的表达式不能分配给声明的类型“List[str]”

看起来类型检查器(pyright)正在考虑to_list返回List[Union[List[str],str]]而不是List[str].

基本上,它没有解释Tstr,而是解释TUnion[List[str], str] 这有点烦人,因为我认为它足够聪明,可以确定 T 是 str ,因为我明确地strobj_type.

我的两个问题是:

from typing import Union, List, TypeVar, Type

T = TypeVar('T')


def to_list(obj_type: Type[T], obj_or_list: Any) -> List[T]:
    ...

标签: pythongenericstypestype-hinting

解决方案



推荐阅读