在类型化 Python 中,如何键入希望传递给另一个更高种类函数的参数的
*args
列表?
例如,此函数采用一个函数及其第一个参数,并且在内部仅路由
*args
,但其类型签名取决于该参数列表(可能是异构的)的类型:
def curry_one[T, R](x: T, f: Callable[[T, WHAT_GOES_HERE], R]) -> Callable[[WHAT_GOES_HERE], R]:
def curried(*args: WHAT_GOES_HERE) -> R:
return f(x, *args)
return curried
Expand可以与某种异构数组上的泛型类型参数一起使用吗?
(我对标准库中的 curry 函数不感兴趣。我正在编写一些特定的函数适配器,只是以 curry 为例。)
您正在寻找
TypeVarTuple
:
(游乐场:Pyright)
def curry_one[T, *Us, R](x: T, f: Callable[[T, *Us], R]) -> Callable[[*Us], R]:
def curried(*args: *Us) -> R:
return f(x, *args)
return curried
def foo(a: int, b: str, c: float, d: bytes) -> None: ...
foo1 = curry_one(0, foo)
reveal_type(foo1) # (str, float, bytes) -> None
foo2 = curry_one('', foo1)
reveal_type(foo2) # (float, bytes) -> None
foo3 = curry_one(3.14, foo2)
reveal_type(foo3) # (bytes) -> None
foo4 = curry_one(b'', foo3)
reveal_type(foo4) # () -> None