在 FastAPI 项目里,配置对象通常只需要加载一次。用 @lru_cache 装饰依赖函数,可以在不引入全局变量的前提下,实现「单例式」的配置访问,测试时也方便覆盖。
示例代码
1 | from functools import lru_cache |
工作原理
@lru_cache 装饰的函数,第一次调用时正常执行并缓存返回值;后续调用直接返回缓存结果,不再重新执行函数体。
对 get_settings() 来说,函数没有参数,所以永远返回同一个 Settings 实例——行为上接近全局变量,但通过依赖注入暴露,测试时可以替换 get_settings 的返回值。
技术细节
@lru_cache 会按参数组合分别缓存。有参数的函数,每种参数组合只执行一次;无参数的函数则始终返回同一对象。
functools.lru_cache 是 Python 标准库的一部分,详见 官方文档。