gpt4 book ai didi

python - 是否存在非协变 `Type[T]` ?

转载 作者:行者123 更新时间:2023-12-05 05:39:07 27 4
gpt4 key购买 nike

假设我正在尝试为一个库函数编写类型提示,该库函数为用户定义的类型注册一个反序列化器:用户应该提供一个类型 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]):
...

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

pyright's inference of int|str

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

最佳答案

使用 mypy --strict 给我预期的错误。必须特定于您正在使用的 linter。

from typing import Callable, Type, TypeVar
T = TypeVar("T")
def register_decoder(type_: Type[T], decode: Callable[[str], T]) -> None:
return

register_decoder(int, str)
>mypy --strict test.py
test.py:6: error: Argument 2 to "register_decoder" has incompatible type "Type[str]"; expected "Callable[[str], int]"
Found 1 error in 1 file (checked 1 source file)

>python --version
Python 3.9.5

>mypy --version
mypy 0.910

关于python - 是否存在非协变 `Type[T]` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72779872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com