如何在 Python 中输入带有默认值的通用可调用对象?

问题描述 投票:0回答:1

在Python中,我有以下函数:

T = TypeVar("T")


def handle_func(x: int, func: Callable[[int], T]) -> T:
    return func(x)

我可以这样使用它:

handle_func(1, lambda x: x + 1)
handle_func(1, lambda x: x == 1)

当我运行 MyPy 时,一切都很好。

但是...如何为

func
添加默认值?

当我这样做时:

def handle_func(x: int, func: Callable[[int], T] = lambda x: x + 1) -> T:
    return func(x)

并运行 MyPy 我得到:

error: Incompatible default for argument "func" (default has type "Callable[[int], int]", argument has type "Callable[[int], T]")  [assignment]
error: Incompatible return value type (got "int", expected "T")  [return-value]

但是当默认值不存在时它就可以工作......我怎样才能输入这个?我理解错了什么?

python generics mypy python-typing
1个回答
0
投票

处理此问题的一种方法是将两种形式分开:

  • 传递一个参数,总是得到一个
    int
    ;和
  • 传递两个参数,获取第二个返回的值。

您可以将其作为重载

from typing import Callable, overload, TypeVar

T = TypeVar("T")

@overload
def handle_func(x: int) -> int:
    ...

@overload
def handle_func(x: int, func: Callable[[int], T]) -> T:
    ...

def handle_func(x, func = lambda x: x + 1):
    return func(x)

mypy 游乐场

© www.soinside.com 2019 - 2024. All rights reserved.