python - 通用列表联盟没有按我期望的方式工作
问题描述
所以我有一个函数,它接受一个 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]
一个 type 的参数Union[List[T],T]
,那么有两种可能性:T
是List[str]
T
是str
,
- 我想知道的是是否有一个特定的/学术/技术名称来确定什么
T
是
- 例如,基本上,如果我传入
解决方案
- 我的第二个问题的部分答案:此过程的技术名称称为 TypeVar 匹配(有时也称为 TypeVar “求解”)。相关链接:https ://github.com/microsoft/pyright/issues/910#issuecomment-667553334
推荐阅读
- python-3.6 - 应用简单训练模型时未命名向量上的 Spacy 错误
- python - Python:将'for'循环转换为while循环,但它必须满足循环内的len(i)条件
- padding - 页面右侧的细白线
- angular - Angular 6 如何手动将样式范围属性添加到变量中的样式字符串?
- c# - .Netcore mvc 获取浮点数
- reactjs - Reactjs App - 从 AWS 而不是服务器文件夹提供图像
- javascript - 无法在 JavaScript Protractor 中减去整数值
- vba - 关于单个单元格的选择
- firebase - 如何使用 Admin SDK 从 firebase 下载链接引用 GCP 云存储对象
- android - 无法解决改造的依赖关系2