可以通过以下代码编写一个返回函数包装器的函数类型:
from typing import Any, Callable, TypeVar
F = TypeVar('F', bound=Callable[..., Any])
def wrap_func(func: F) -> Callable[..., Any]:
def wrapper_func(*args, **kwargs) -> Any:
print("Calling function...")
result = func(*args, **kwargs)
print("Function call finished.")
return result
return wrapper_func
@wrap_func
def example_func(n: int) -> int:
return n*n
print(example_func(5)) # Output: Calling function... Function call finished. 25
上述代码中,我们定义了一个类型变量 F
,它是一个绑定了可调用对象的泛型类型。接下来定义了一个名为 wrap_func
的函数,它的参数是 func: F
,返回值是一个可调用对象。在返回的可调用对象中,我们定义了一个名为 wrapper_func
的装饰器,它运行传入 @wrap_func
的函数并打印出相应的信息。最后我们定义了一个名为 example_func
的函数,它接受一个整数作为参数并返回它的平方,我们通过装饰器 @wrap_func
来调用这个函数并打印出相应的信息。