「TF」03 TOML:面向未来的配置语言
Greetings! ¶
嗨!这里是阿乎的博客!(> ▽ <) /~
只要你和开源项目打过交道,就免不了要和各种配置文件亲密接触。
这些文件的格式五花八门——常见的有 JSON、YAML、INI……
但近几年,一个新面孔在 Python 世界里异军突起,它就是 TOML。
它不仅是 pyproject.toml
的标准,也正迅速成为现代 Python 工具链的共同选择。
今天,我们就来聊聊 TOML 的魅力,顺便分享一下在 Python 中如何轻松上手。
1. Background ¶
TOML,全称 Tom’s Obvious Minimal Language,由 GitHub 联合创始人 Tom Preston-Werner 创造。
难怪影响力那么大——
名字里的关键词其实就定义了它的性格:
- Minimal:语法极简,学习成本低。
- Obvious:语义直白清晰,不会被奇怪的缩进或符号搞糊涂。
- Language:虽然叫“语言”,但它的目标不大,只专注于存配置。
为什么现在要关注 TOML?
因为 Python 官方已经在全面拥抱它:
- PEP 621 将
pyproject.toml
定为项目元数据的核心入口; - 新一代的
uv
、poetry
,以及主流的black
、ruff
等工具,都把它作为首选配置文件。
对我来说,TOML 的价值主要在于:它不一定是“最强大”的,但它几乎是 Python 生态里未来不可避免的选择。
2. 通过对比认识 TOML ¶
说配置文件,不比较几个“老对手”就没意思了。我们用一个常见的“服务 + 数据库”配置场景,来看看 TOML、JSON 和 YAML 各自的表现。
2.1 基础结构对比 ¶
JSON ¶
JSON有着括号和引号繁多的特点,同时对于结尾括号的处理十分严格,手写时容易因少个逗号而报错。
JSON:
{
"server": {
"host": "127.0.0.1",
"port": 8000
},
"database": {
"user": "admin",
"password": "123456"
}
}
YAML ¶
YAML相比JSON则显得更加直观简洁,但对缩进极其敏感。因为缩进的观察性差,容易引发难以察觉的错误。
YAML:
server:
host: "127.0.0.1"
port: 8000
database:
user: "admin"
password: "123456"
TOML ¶
TOML通过 [section]
表头区分,像 INI 文件一样直观清晰,但又支持更复杂的数据类型和嵌套结构,兼具简洁与表达力。😎
TOML:
[server]
host = "127.0.0.1"
port = 8000
[database]
user = "admin"
password = "123456"
2.2 嵌套结构对比 ¶
对于有嵌套需求的配置,三者的对比就更明显了。
JSON: ¶
JSON层级越深,括号越多,视觉负担也越重。
{
"server": {
"host": "127.0.0.1",
"port": 8000,
"ssl": {
"enabled": true,
"certfile": "cert.pem"
}
}
}
YAML: ¶
YAML继续依赖缩进。虽然相对直观,但配置一旦复杂,维护成本就会直线上升。
server:
host: "127.0.0.1"
port: 8000
ssl:
enabled: true
certfile: "cert.pem"
TOML: ¶
TOML通过 server.ssl
点分隔键来表达层级,避免过深缩进,结构清晰的同时又兼顾了可读性。
[server]
host = "127.0.0.1"
port = 8000
# 使用点分隔键,优雅地表达嵌套
[server.ssl]
enabled = true
certfile = "cert.pem"
2.3 “足够好”的哲学 ¶
TOML 并不想替代一切,它的设计哲学是:
成为一种清晰、直观、不易出错的配置文件格式。
正是这种“足够好”,让 Python 社区敢于放心地选择它来统一元数据。
这种设计哲学确实有点意思。“我不强制所有人使用我。只要我足够好,那么大家就会愿意用我。”这样的表达很谦逊,而谦逊的表达又往往更容易被接受。
—— 这些特质放在一起,确实足够吸引人。
3. 与Python交互的简单示例 ¶
对于 Python 开发者来说,使用 TOML 也是十分便利。
在 Python 3.11 及以上版本中,标准库内置了
tomllib
模块,可以直接解析 TOML 文件。
- 新建一个
config.toml
:
[server]
host = "127.0.0.1"
port = 8000
- Python 3.11+ 用户,直接使用内置
tomllib
库:
import tomllib
with open("config.toml", "rb") as f:
cfg = tomllib.load(f)
print(cfg["server"]["port"]) # 8000
- Python 低于3.11 的环境,安装
tomli
库即可:
pip install tomli
用法与 tomllib
完全一致,只需要修改引用的模块名:
import tomli
with open("config.toml", "rb") as f:
cfg = tomli.load(f)
print(cfg["server"]["port"]) # 8000
4. 一些不足 ¶
当然,TOML 也不是万能的:
- 极度复杂的数据结构 → JSON 更灵活。
- 多语言通用性 → YAML 在 DevOps 场景(Docker、k8s)依然是主流。
因此,一个务实的策略是:
在 Python 生态里拥抱 TOML,在其他领域灵活选择 JSON/YAML,不必非此即彼。
照应 TOML 的“足够好”哲学。
5. 总结 ¶
对我而言,TOML 不仅仅是一种配置文件格式,更像是一个信号:
它代表着 Python 生态未来的发展方向。
学习 TOML,并不是否定 JSON 或 YAML,而是一种防御式选择。
当整个生态都在向它靠拢时,提前熟悉它,总比日后被迫追赶来得从容。😎