标准答案

  1. 模块顶层代码在首次导入时执行,模块级可变状态会跨请求和测试共享。
  2. 循环导入可能得到部分初始化的名称,错误常表现为 ImportError 或 AttributeError。
  3. 把业务执行放在 import 顶层会增加启动副作用和测试隔离难度。
  4. 依赖方向应清晰,插件注册可使用显式入口而不是隐式循环导入。

题目解析

模块首次导入时执行顶层代码并缓存到 sys.modules,后续请求复用同一模块实例。模块级工具和连接池可以共享,但用户、租户、请求和临时任务状态不能放在那里。

循环导入可能拿到部分初始化模块,产生 ImportError/AttributeError。应拆分共享类型和常量、调整依赖方向或用显式插件注册,而不是靠随机延迟导入掩盖。

导入副作用会增加启动时间、测试隔离和部署风险。连接、线程、定时器和后台任务应由应用生命周期显式启动和关闭。

常见误区

  • 误区:模块全局保存当前用户。改正:使用请求上下文或显式参数,模块缓存是进程级共享。
  • 误区:用随机延迟导入掩盖循环依赖。改正:拆分依赖方向或显式初始化,保证加载顺序可解释。
  • 误区:导入时连接生产数据库和启动后台任务。改正:在启动阶段显式创建并在停机阶段关闭资源。

作者信息