微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 TypeVar 作为 Callable 的参数的问题

如何解决使用 TypeVar 作为 Callable 的参数的问题

我遇到了以下代码的问题,至少根据 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],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]}")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。