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

为类的函数参数指定两种调用签名时,如何解决mypy类型不兼容问题?

解决Callable类型提示不匹配的问题

你当前的类型提示逻辑有误:Callable[[Union[int, list[int]]], int]要求传入的函数必须同时能接收int和list[int]类型的参数,但identity函数只能处理int,不符合该要求,因此mypy报错。

正确的写法是用Union包裹两个不同的Callable类型,明确表示构造函数接受的是两种函数中的任意一种:

from typing import Callable, Union, List

class Foo:
    def __init__(self, func: Union[Callable[[int], int], Callable[[List[int]], int]]) -> None:
        self.func = func

def identity(num: int) -> int:
    return num

Foo(identity)  # 此时mypy不会再报错

额外说明

如果Foo类内部需要调用self.func,需确保传入的参数类型与函数接受的类型匹配。若不确定函数类型,可先做类型判断让mypy正确推断:

from typing import Callable, Union, List, TypeVar

T = TypeVar('T', int, List[int])

class Foo:
    def __init__(self, func: Union[Callable[[int], int], Callable[[List[int]], int]]) -> None:
        self.func = func

    def call_func(self, arg: T) -> int:
        if isinstance(arg, int):
            # mypy会自动推断此处self.func是Callable[[int], int]
            return self.func(arg)
        elif isinstance(arg, list):
            # mypy会自动推断此处self.func是Callable[[List[int]], int]
            return self.func(arg)
        else:
            raise TypeError("不支持的参数类型")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:35:14