类型注解Callable

发布时间 2023-08-28 11:10:11作者: 我在路上回头看
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)