功能说明
示例用标准库 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] 表或把端口改成字符串,验证对应的校验分支。