from collections.abc import Callable
"""
Callable[[ParamType1, ParamType2], ReturnType]
[参数1类型,参数2类型], 返回值类型
Callable[[], int] 是 Callable[[], float] 的子类型,因为 int 是 float 的子类型。
这意味着,那个 Callable 的返回值类型经历了协变(covariant),
因为 int 和 float 之间具有子类型关系,而且变化方向与 Callable 类型中返回值的类型变化方向相同。
反过来,如果回调预期处理 float 值,却提供接受 int 参数的回调,则会导致类型错误。
Callable[[int], None] 不是 Callable[[float], None] 的子类型。
虽然 int 是 float 的子类型,但是在参数化 Callable 类型中,关系是相反的,
即 Callable[[float], None] 是 Callable[[int], None] 的子类型。
因此我们说,那个 Callable 声明的参数类型经历了逆变(contravariant)。
"""
def update(probe: Callable[[], float], display: Callable[[float], None]) -> None:
temperature = probe()
display(temperature)
def probe_ok() -> int: #int是float的子类型,所以Callable定义的返回类型float兼容int,即协变
return 42
def display_wrong(temperature: int) -> None:
print(hex(temperature))
update(probe_ok, display_wrong) # 类型错误error: Argument 2 to "update" has incompatible type "Callable[[int], None]"; expected "Callable[[float], None]" [arg-type]
def display_ok(temperature: complex) -> None:
print(temperature)
update(probe_ok, display_ok)
标签:None,temperature,int,float,Callable,类型,注解
From: https://www.cnblogs.com/weiweivip666/p/17661795.html