您不能Callable
说任何其他参数。它们不是通用的。您唯一的选择是说您的装饰器采用,Callable
并且Callable
返回不同的值。
您 可以 使用typevar来确定返回类型:
RT = TypeVar('RT') # return type
def inject_user() -> Callable[[Callable[..., RT]], Callable[..., RT]]:
def decorator(func: Callable[..., RT]) -> Callable[..., RT]:
def wrapper(*args, **kwargs) -> RT:
# ...
即使这样,最终的修饰foo()
函数也具有def (*Any, **Any) -> builtins.bool*
您使用时的键入签名reveal_type()
。
当前正在讨论各种提案以Callable
提高灵活性,但这些提案尚未实现。看到
对于一些例子。该列表中的最后一个是一张总括票,其中包括您的特定用例,用于更改可调用签名的装饰器:
对于任意函数,您根本无法执行此操作-甚至没有语法。这是我组成的一些语法。