python - 使用 TypeVar 作为 Callable 的参数时出现问题

标签 python python-3.x mypy python-typing

我在以下代码中遇到了问题,至少根据 mypy 是这样的:

from multiprocessing import Pool
from typing import Tuple, TypeVar

T = TypeVar("T", int, str)


def do_something(a: T) -> Tuple[T, bool]:
    # Something happening here...
    return a, False


if __name__ == "__main__":
    pool = Pool(processes=10)
    nums = list(range(100000, 1000000))
    for r in pool.imap_unordered(do_something, nums):
        if r[1]:
            print(f"Got {r[0]}")

当我使用 mypy 检查它时,出现以下错误:

error: Argument 1 to "imap_unordered" of "Pool" has incompatible type "Callable[[T], Tuple[T, bool]]"; expected "Callable[[int], Tuple[T, bool]]"

实际类型显然应该满足预期类型。 我做错了什么还是 mypy 或 multiprocessing.Pool 中的错误?

预先感谢您的任何评论。

最佳答案

如 Jasmijn 的评论所示,这是一个最小的示例:

from typing import TypeVar

T = TypeVar("T")

def do_something(a: T) -> T:
    return a

map(do_something, [1])

此操作失败并出现相同的错误。我认为这是 mypy 的限制,但我们可以通过引入一个额外的辅助函数来修复它,通过该函数我们显式提供类型,而不是 mypy 必须推断它。

def new_do_something(t: Type[T]) -> Callable[[T], T]:
    return do_something

使用上述内容,这不再导致任何错误,同时仍然允许 do_something 是通用的:

map(new_do_something(int), [1])

对于您的原始示例,修改后的版本将如下所示:

from multiprocessing import Pool
from typing import Tuple, TypeVar, Type, Callable

T = TypeVar("T", int, str)


def do_something(a: T) -> Tuple[T, bool]:
    # Something happening here...
    return a, False

def new_do_something(t: Type[T]) -> Callable[[T], Tuple[T, bool]]:
    return do_something

if __name__ == "__main__":
    pool = Pool(processes=10)
    nums = list(range(100000, 1000000))
    for r in pool.imap_unordered(new_do_something(int), nums):
        if r[1]:
            print(f"Got {r[0]}")

关于python - 使用 TypeVar 作为 Callable 的参数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68132296/

相关文章:

python - python中 float 组的最小值

python - Pandas 中的嵌套分组

python-3.x - Google Cloud Functions (GCF) - 使用 apt-get 安装软件包

javascript - 在 Python 中更改来自 Selenium 的元素列表

python - 为什么在Python中使用typing.Generic时保留cls关键字属性?

python - NamedTuple 的子类化给出了不兼容的返回类型/参数类型

python - Sklearn 中的非负矩阵分解

python - 将 WandImageObject 转换为 QPixmap

python - 使用 Python 和 OpenCV3 检测流程图中的文本区域

python - 兄弟包导入和mypy "has no attribute"错误