假设我有一个函数,它接受一个函数并生成一个新函数,该函数使用两组不同的输入调用原始函数两次:
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) -> ...
但我不知道如何实现这一点。
任何帮助表示赞赏:)
现在可以使用
TypeVarTuple
s:
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
仅代表类型。