异构 *args 的类型

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

在类型化 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 为例。)

python variadic-functions python-typing higher-order-functions
1个回答
0
投票

您正在寻找

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
© www.soinside.com 2019 - 2024. All rights reserved.