← 中文资源

简体中文版本

从 TOML 文件加载类型化配置

用标准库 tomllib 解析 TOML,映射为冻结数据类,并逐项校验 service 与 database 表的名称、端口和连接池大小。

阅读英文原文

功能说明

示例用标准库 tomllib 读取 TOML 配置,并映射为两个冻结数据类。load_settings 先解析整个文件,再逐项检查 [service] 与 [database] 表:名称必须是非空字符串,端口必须是 1 到 65535 的整数,连接池大小必须为正。类型不匹配或缺少表时抛出 ConfigError,不会把错误类型带进业务代码。

关键代码

try:
    raw = tomllib.loads(path.read_text(encoding="utf-8"))
except tomllib.TOMLDecodeError as error:
    raise ConfigError(f"invalid TOML: {error}") from error

service = raw.get("service")
if not isinstance(service, dict):
    raise ConfigError("missing [service] table")

tomllib 只负责语法解析,语义校验仍需逐字段完成。

使用注意

  • tomllib 是 Python 3.11 新增的只读解析器,不能把对象写回 TOML。
  • TOML 的整数与布尔在 Python 中分别是 int 与 bool,而 bool 是 int 子类,端口校验必须先排除布尔值。
  • 示例只读取本地文件,路径由调用方提供;生产环境应限制配置文件位置与权限。
  • 未知键不会报错,便于配置向前兼容;需要严格模式时应自行比对允许的键集合。
  • 冻结数据类只防止字段重新赋值,嵌套对象也已经是冻结的。

验证方式

示例写入一个包含 [service] 与 [database] 的合法 TOML,应打印配置对象与默认连接池大小 5;第二个文件缺少右括号,应输出 invalid TOML 错误。可以删除 [database] 表或把端口改成字符串,验证对应的校验分支。