Python中compose函数的Mypy类型检查未生效,如何修复?
问题解答
这是预期情况吗?
是的,这种情况是Mypy处理泛型函数的正常表现。
你给compose标注的返回类型是Callable[[H], int],Mypy会将其解读为约束泛型参数S必须等于int——也就是说,这个compose函数只能接受返回值为int的f函数。在函数定义阶段,Mypy仅检查函数体逻辑是否符合该约束:你的aux函数确实返回了S类型(也就是被约束为int)的值,因此不会触发错误。只有当你传入返回值非int的f调用compose时,Mypy才会报错。
如何实现精准的类型检查?
要让compose支持任意兼容的函数组合,并让Mypy进行全阶段的精准检查,需要做两处调整:
- 将
compose的返回类型修正为正确的Callable[[H], S],让泛型参数完整传递类型信息 - 给内部的
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
相关产品推荐
相关产品推荐

