
在 Python 中,当我们需要处理一个接受可变数量参数的 Callable 对象,并且希望确保这些参数的类型与某个可迭代对象中的元组类型相匹配时,可以使用 typing.TypeVarTuple 和 typing.Unpack 来实现。 这两个工具允许我们定义一个泛型,该泛型可以捕获任意数量的类型,并将它们应用于函数参数和可迭代对象中的元组。
下面是一个 starmap 函数的例子,它类似于 itertools.starmap,但提供了更精确的类型提示:
from typing import (
Callable,
Generator,
Iterable,
TypeVar,
TypeVarTuple,
Unpack,
)
T = TypeVar("T")
Ts = TypeVarTuple("Ts")
def starmap(
func: Callable[[Unpack[Ts]], T], iterable: Iterable[tuple[Unpack[Ts]]]
) -> Generator[T, None, None]:
yield from map(func, *zip(*iterable))在这个例子中:
示例:
立即学习“Python免费学习笔记(深入)”;
import itertools
def func(x: int, y: int) -> float:
return x + y
args = func, [(1, 2), (3, 4)]
assert list(itertools.starmap(*args)) == list(starmap(*args))在这个示例中,func 接受两个 int 类型的参数,并返回一个 float 类型的值。iterable 包含两个元组,每个元组都包含两个 int 类型的值。starmap 函数将 func 应用于 iterable 中的每个元组,并将结果生成为一个迭代器。
注意事项:
总结:
通过使用 typing.TypeVarTuple 和 typing.Unpack,我们可以为接受可变数量参数的 Callable 对象创建更精确的类型提示。这可以帮助我们编写更健壮的代码,并减少运行时错误的发生。 这种方法特别适用于需要处理具有不同参数数量的函数的场景, 例如数据处理、函数组合等。
以上就是如何在 Python 中为 Callable 创建一个具有未知数量参数的泛型?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号