标准答案
- 模块顶层代码在首次导入时执行,模块级可变状态会跨请求和测试共享。
- 循环导入可能得到部分初始化的名称,错误常表现为 ImportError 或 AttributeError。
- 把业务执行放在 import 顶层会增加启动副作用和测试隔离难度。
- 依赖方向应清晰,插件注册可使用显式入口而不是隐式循环导入。
题目解析
模块首次导入时执行顶层代码并缓存到 sys.modules,后续请求复用同一模块实例。模块级工具和连接池可以共享,但用户、租户、请求和临时任务状态不能放在那里。
循环导入可能拿到部分初始化模块,产生 ImportError/AttributeError。应拆分共享类型和常量、调整依赖方向或用显式插件注册,而不是靠随机延迟导入掩盖。
导入副作用会增加启动时间、测试隔离和部署风险。连接、线程、定时器和后台任务应由应用生命周期显式启动和关闭。
常见误区
- 误区:模块全局保存当前用户。改正:使用请求上下文或显式参数,模块缓存是进程级共享。
- 误区:用随机延迟导入掩盖循环依赖。改正:拆分依赖方向或显式初始化,保证加载顺序可解释。
- 误区:导入时连接生产数据库和启动后台任务。改正:在启动阶段显式创建并在停机阶段关闭资源。