You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中compose函数的Mypy类型检查未生效,如何修复?

问题解答

这是预期情况吗?

是的,这种情况是Mypy处理泛型函数的正常表现。

你给compose标注的返回类型是Callable[[H], int],Mypy会将其解读为约束泛型参数S必须等于int——也就是说,这个compose函数只能接受返回值为int的f函数。在函数定义阶段,Mypy仅检查函数体逻辑是否符合该约束:你的aux函数确实返回了S类型(也就是被约束为int)的值,因此不会触发错误。只有当你传入返回值非int的f调用compose时,Mypy才会报错。

如何实现精准的类型检查?

要让compose支持任意兼容的函数组合,并让Mypy进行全阶段的精准检查,需要做两处调整:

  1. 将compose的返回类型修正为正确的Callable[[H], S],让泛型参数完整传递类型信息
  2. 给内部的aux函数也加上明确的类型注解,帮助Mypy更清晰地校验类型匹配

修改后的代码如下:

from typing import Sequence, TypeVar, Callable

T = TypeVar('T')
S = TypeVar('S')
H = TypeVar('H')

def first(l: Sequence[T], h : Sequence[S]) -> tuple[T,S]:
    return (l[0],h[0])

def eval(f : Callable[[T],S], arg : T) -> S :
    return f(arg)

def compose(f: Callable[[T], S], g: Callable[[H], T]) -> Callable[[H], S]:
    def aux(x: H) -> S:
        a = g(x)
        b = f(a)
        return b
    return aux

这样修改后:

  • 当你错误修改compose的返回类型(比如改成Callable[[H], int]),Mypy会直接在定义阶段提示类型不匹配
  • 调用compose时,如果传入的函数类型不兼容(比如f的参数类型和g的返回类型不匹配),Mypy也会及时报错

内容的提问来源于stack exchange,提问作者josinalvo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:17:30