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
相关产品推荐
相关产品推荐

