为类的函数参数指定两种调用签名时,如何解决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
相关产品推荐
相关产品推荐

