You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于装饰器定义类型提示及注入参数类型自动推导的技术问询

关于装饰器定义类型提示及注入参数类型自动推导的技术问询

嘿,这个问题问得好!其实你不用遗憾——现在借助Python的类型注解工具和主流类型检查器(比如mypy、PyRight),完全可以实现让装饰器把注入参数的类型自动“传递”给被装饰函数,不用你手动给参数加类型注解!

你之前写的装饰器类型注解范围太窄了,只固定接受Callable[[float], None]类型的函数,我们可以用typing里的泛型工具来改造它,让类型检查器能自动追踪到注入参数的类型。

先看改造后的完整代码:

from typing import Callable, TypeVar
import time

# 定义一个绑定到float的类型变量,用来标记我们要注入的参数类型
InjectedTimestamp = TypeVar("InjectedTimestamp", bound=float)

def pass_timestamp(fn: Callable[[InjectedTimestamp], None]) -> Callable[[], None]:
    def wrapper() -> None:
        # 注入float类型的当前时间戳
        fn(time.time())
    return wrapper

现在当你用这个装饰器装饰函数时,哪怕不给ts加任何类型注解,类型检查器也能自动推断出它的类型是float:

@pass_timestamp
def some_func(ts):
    reveal_type(ts)  # 用mypy或PyRight检查的话,会输出「Revealed type is 'float'」

原理其实很简单:我们用TypeVar把装饰器接受的函数参数类型和float做了绑定,类型检查器会根据装饰器的类型约束,自动把被装饰函数的ts参数类型推断为float——相当于装饰器把它要注入的参数类型“告知”了类型检查器,省得你手动写ts: float。

小提醒:不同类型检查器的严格模式可能有差异,比如PyRight如果开了strictParameterTypes严格选项,可能会提示你显式标注参数类型,但在默认或宽松模式下,自动推导完全没问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:10:29