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

FastAPI启动事件:根级定义字典为何优于函数内用global?

为什么在FastAPI根层级定义字典并在启动事件中填充,比在启动事件内用global声明更好?

先看示例代码:

from fastapi import FastAPI

app = FastAPI()

items = {}


@app.on_event("startup")
async def startup_event():
    items["foo"] = {"name": "Fighters"}
    items["bar"] = {"name": "Tenders"}


@app.get("/items/{item_id}")
async def read_items(item_id: str):
    return items[item_id]

具体原因如下:

  • 代码更直观,维护成本低:根层级直接定义items,所有人一眼就能看出这是个模块级的共享变量,后续维护时不用钻进启动事件函数里找global声明才能明白变量的作用范围。要是用global,变量的声明和初始化分散在不同地方,逻辑连贯性差,容易让人懵。
  • 减少不必要的bug:字典是可变对象,根层级定义后,启动事件里只是修改它的内部内容(加键值对),不需要global就能操作。如果用global,万一拼写错变量名,会意外创建一个局部变量,导致路由接口访问不到正确数据,这种bug排查起来还挺麻烦的。
  • 符合Python作用域的最佳实践:Python里修改可变对象的内部状态不需要声明全局,只有重新给变量赋值(比如items = {"foo": ...})才需要global。根层级定义再填充的写法,刚好契合这个规则,是更规范的写法。
  • 适配FastAPI的运行逻辑:FastAPI启动时会先加载模块里的所有顶层代码,根层级的items会提前存在,启动事件只是补充内容,这样路由函数调用时,变量肯定已经完成初始化了。要是在启动事件里用global创建变量,模块加载时变量还不存在,逻辑上不够顺畅。

内容的提问来源于stack exchange,提问作者dataviews

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:00:34