假设我正在尝试为一个库函数编写类型提示,该函数为用户定义的类型注册反序列化器:用户应该提供一个类型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:
decode有没有一种方法可以类型提示此方法,强制返回 实例的约束,以便此示例因不返回type_而引发错误?可以完成这项工作的一件事是非协变等价物,它只接受确切的类对象而不是任何子类型,但我不确定Python中是否存在这样的东西。strintType[T]T
python typing higher-order-functions invariance python-typing