python - 一个函数的类型提示包装另一个函数,接受相同的参数

标签 python type-hinting

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 和其他编辑器中不会正确自动完成。

最佳答案

您最好为此使用装饰器,您可以使用ConcatenateParamSpec。我使用 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/

相关文章:

python - 类型错误 : can only concatenate str (not "int") to str SUM

python - 如何在python中向 "class"类型添加类型提示

python - 键入Hint可进行有限迭代

python - 为什么扩展模板时我的表单不起作用

Python:如何查看今年给定的月份和日期是否已经过去?

python - 如何在Python中循环遍历字母表索引?

python - 如何创建包含 threading.Event 和 multiprocessing.Event 的协议(protocol)?

Python-tkinter组合框保存值

python - 是否有根据类型提示检查类型的 python linter?

python - 如何在 Python 中将 typing.Union 转换为其子类型之一?