def function(a: int, b: str) -> None:
pass
def wrapper(extra: int, *args, **kwargs) -> None:
do_something_with_extra(extra)
function(*args, **kwargs)
有没有一种简单的方法可以让包装器继承 function() 的类型提示而无需重新输入所有类型提示? 通常我会写
def wrapper(extra: int, a: int, b: str) -> None:
但是它变得非常冗长,有很多参数,每次我更新 function() 的参数时我都必须更新 wrapper(),并且使用 *args, **kwargs
意味着那里在 vscode 和其他编辑器中不会正确自动完成。
最佳答案
您最好为此使用装饰器,您可以使用Concatenate
和ParamSpec
。我使用 python 3.8,我必须为它们安装 typing_extensions
。
在下面的代码中,如果您在 VSCode 中键入 function,它将显示 int 参数,但前面没有“额外”名称。
from typing import Callable, TypeVar
from typing_extensions import Concatenate, ParamSpec
P = ParamSpec('P')
R = TypeVar('R')
def wrapper(func: Callable[P, R]) -> Callable[Concatenate[int, P], R]:
def inner(extra, *args, **kwargs):
print(extra)
func(*args, **kwargs)
return inner
@wrapper
def function(a: int, b: str) -> None:
print(a, b)
pass
# typing function will show 'function: (int, a: int, b: str) -> None'
关于python - 一个函数的类型提示包装另一个函数,接受相同的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71031173/