【发布时间】:2020-11-22 21:45:02
【问题描述】:
所以我有一个函数,它接受一个 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]。
基本上不是将T 解释为str,而是将T 解释为Union[List[str], str]
这有点烦人,因为我认为确定 T 是 str 会足够聪明,因为我明确地将 str 传递为 obj_type。
我的两个问题是:
- 有没有办法实现我想要的?基本上是一个函数,它接受对象列表或单个对象并返回对象列表(同时保留类型提示) 我目前的解决方法是这样的
from typing import Union, List, TypeVar, Type
T = TypeVar('T')
def to_list(obj_type: Type[T], obj_or_list: Any) -> List[T]:
...
- 是否有确定通用参数如何解析的技术名称?所以我可以搜索并了解它?
- 例如基本上,如果我将
List[str]传递给Union[List[T],T]类型的参数,那么有两种可能性:-
T是List[str] -
T是str,
-
- 我想知道的是,确定
T是什么的过程是否有一个特定的/学术/技术名称
- 例如基本上,如果我将
【问题讨论】:
-
我已复制粘贴您的代码并运行它,工作正常,没有出现任何错误。你用的是什么版本的python?我用 3.7 测试过
-
这不是一个真正的错误。它只是一个类型检查错误。我将 vscode 与 pylance 和 python 扩展一起使用
标签: python generics types type-hinting