MyPy 可以推断动态生成函数的签名吗?

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

假设我有一个函数,它接受一个函数并生成一个新函数,该函数使用两组不同的输入调用原始函数两次:

def duplicate(f):
  def g(args1, args2):
    return (f(*args1), f(*args2))
  return g

有没有办法为此函数提供类型注释,以便 mypy 能够根据

g
推断
f
的签名?特别是,如果我提供:

def f(a: int, b: str):
  ...

并制作:

g = duplicate(f)

我希望能够推断出

g
的签名是
(int, str, int, str) -> ...
但我不知道如何实现这一点。

任何帮助表示赞赏:)

python python-typing mypy
1个回答
0
投票

现在可以使用

TypeVarTuple
s:

(游乐场:MypyPyright

def duplicate[*Ts, R](f: Callable[[*Ts], R]) -> Callable[[tuple[*Ts], tuple[*Ts]], tuple[R, R]]:
    def g(args1: tuple[*Ts], args2: tuple[*Ts]) -> tuple[R, R]:
        return f(*args1), f(*args2)

    return g
def f(a: int, b: str) -> bytes: ...

reveal_type(duplicate(f))  # (tuple[int, str], tuple[int, str]) -> tuple[bytes, bytes]

对于上面的示例,

Ts
匹配
int
str
。然后将其解压回
tuple[]
(
tuple[*Ts]
),创建
tuple[int, str]
。参数名称不会保留,因为
TypeVarTuple
仅代表类型。

© www.soinside.com 2019 - 2024. All rights reserved.