如何输入带有可调用参数和默认值的提示函数

ldc*_*ldc 5 python python-3.x mypy

我正在尝试输入提示接受可调用函数并具有默认参数的函数的参数(在下面的示例中set

from typing import Callable, List
T = TypeVar("T")
def transform(data: List[int], ret_type: Callable[[List[int]], T] = set) -> T:
    return ret_type(data)

a = [1, 2, 3]
my_set: Set = transform(a)
Run Code Online (Sandbox Code Playgroud)

上面的代码从 mypy 触发以下错误消息mypy3: Incompatible default for argument "ret_type" (default has type "Type[Set[Any]]", argument has type "Callable[[List[int]], T]")

正确的类型应该是什么ret_type

编辑

下面的代码虽然不理想但工作正常(参见@chepner评论)

from typing import cast, Any, Callable, TypeVar

T = TypeVar("T")

def transform(data: Any, ret_type: Callable[..., T] = cast(Callable, set)) -> T:
    return ret_type(data)
Run Code Online (Sandbox Code Playgroud)

ale*_*ame 2

您可以使用@overload为您的案例使用默认参数的函数进行正确的类型提示:

from typing import Callable, List, TypeVar, overload, Set

T = TypeVar("T")

@overload
def transform(data: List[int]) -> Set[int]: ...

@overload
def transform(data: List[int], ret_type: Callable[[List[int]], T]) -> T: ...
    
# untyped implementation
def transform(data, ret_type = set):
    return ret_type(data)

a = [1, 2, 3]
my_set: Set = transform(a)
Run Code Online (Sandbox Code Playgroud)