小编Ant*_*tis的帖子

是否存在非协变“Type[T]”?

假设我正在尝试为一个库函数编写类型提示,该函数为用户定义的类型注册反序列化器:用户应该提供一个类型T和一个函数decode: str -> T

我认为使用 python 的 PEP-484 类型提示编写此代码的最自然方法如下:

from typing import Callable, Type, TypeVar
T = TypeVar("T")
def register_decoder(type_: Type[T], decode: Callable[[str], T]):
    ...
Run Code Online (Sandbox Code Playgroud)

Type[T]对我来说不幸的是,协变的事实T意味着这对于解码函数来说不够严格:至少在 Pyright 中,register_decoder(int, decode=str)调用通过类型检查,类型变量T解析为 union int | str

Pyright 对 int|str 的推论

decode有没有一种方法可以类型提示此方法,强制返回 实例的约束,以便此示例因不返回type_而引发错误?可以完成这项工作的一件事是非协变等价物,它只接​​受确切的类对象而不是任何子类型,但我不确定Python中是否存在这样的东西。strintType[T]T

python typing higher-order-functions invariance python-typing

5
推荐指数
1
解决办法
392
查看次数