最近逛GitHub上的热门项目时,有个现象挺有意思。不管是Rust项目里的 Cargo.toml,还是Python项目里的 pyproject.toml,甚至连很多AI智能体的配置里,你都会反复看到一个名字:TOML。

这就让人有点好奇了:为什么开发者们放着大家熟知的 JSON 和 YAML 不用,反而纷纷拥抱这个“新面孔”呢?
说白了,原因可能很简单:人类的耐心是有限的,而配置文件的“坑”是无限的。
什么是 TOML?
TOML 的全称是 Tom‘s Obvious Minimal Language,翻译过来就是 Tom 的浅显的、极简的语言。
从名字就能看出,它的作者 Tom Preston-Werner(他也是 GitHub 的创始人之一)设计它的初衷就两点:显而易见 和 极简。

它的设计目标非常明确:让一个不怎么懂代码的人,也能一眼看懂配置写了什么,并且能够手动修改而不出错。

“看起来是不是有点像 Windows 时代我们熟悉的 .ini 文件?”

为什么 JSON 和 YAML “失宠”了?
在 TOML 流行起来之前,配置文件领域主要是 JSON 和 YAML 的天下。但它们各自都有一些让开发者头疼的问题。
JSON:对机器友好,对人刻薄
JSON 格式规整,机器解析起来非常高效,但写起来对人就不那么友好了。满眼的大括号、中括号,还有必须严格遵守的双引号规则。最让人抓狂的莫过于那条“最后一行不能加逗号”的潜规则,一旦漏写或多写一个标点,整个解析过程立刻失败。
{
"global": {
"cache-dir": "D:\\Programs\\Python\\Python36\\pipcache",
"timeout": 6000,
"index-url": "http://mirrors.aliyun.com/pypi/simple/"
},
"install": {
"trusted-host": "mirrors.aliyun.com"
}
}
YAML:对人友好,对空格变态
YAML 看起来确实清晰优雅,层级分明,可读性很高。但它对缩进(空格)有着近乎变态的严格要求。在 YAML 里,缩进不仅仅是为了美观,它直接决定了数据的结构和层级。稍微多敲或少敲一个空格,整个配置的逻辑就可能完全乱掉,而且这种错误非常隐蔽,排查起来极其困难。
global:
cache-dir: D:\Programs\Python\Python36\pipcache
timeout: 6000
index-url: http://mirrors.aliyun.com/pypi/simple/
install:
trusted-host: mirrors.aliyun.com
TOML:走第三条路
TOML 则试图在两者之间找到平衡。它既有 JSON 那种清晰、无歧义的逻辑结构,又保留了类似传统 .ini 文件的简洁和亲切感,降低了人工编写和阅读的门槛。
[global]
cache-dir = "D:\\Programs\\Python\\Python36\\pipcache"
timeout = 6000
index-url = "http://mirrors.aliyun.com/pypi/simple/"
[install]
trusted-host = "mirrors.aliyun.com"
相比之下,你觉得哪种风格的配置文件更顺眼呢?
怎么在 Python 中读取 TOML?
从 Python 3.11 版本开始,标准库就内置了 tomllib 模块,这意味着你无需安装任何第三方库就能直接解析 TOML 文件,非常方便。
import tomllib
def read_toml_config(filepath="config.toml"):
with open(filepath, "rb") as f:
# 使用 tomllib.load() 将文件内容解析为字典
data = tomllib.load(f)
return data
# 示例:读取并访问数据
config_data = read_toml_config("pyproject.toml") # 假设你的 TOML 文件名为 pyproject.toml
print(f"全局缓存目录: {config_data['global']['cache-dir']}")
print(f"超时设置: {config_data['global']['timeout']}")
为什么开源社区都在跟进?
Python 社区
在 Python 生态中,pyproject.toml 已经成为事实上的新标准。它成功地统一了之前分散的 setup.py、requirements.txt、setup.cfg 等多个文件,将项目元数据、依赖管理和构建配置集中到了一个文件中,大大简化了项目结构。
Rust 社区
以严谨和安全著称的 Rust 语言,从诞生之初就选择了 TOML 作为其包管理器 Cargo 的配置格式。Cargo.toml 文件定义了项目的所有元信息、依赖项和构建脚本,这种一致性也推动了 TOML 在系统编程领域的普及。
DevOps 领域
在容器化和持续集成/持续部署 (CI/CD) 领域,清晰的配置至关重要。越来越多的工具开始采用 TOML 来编写配置文件,一个重要原因就是为了减少因人工修改复杂 YAML 或 JSON 配置时,因格式错误而引发的线上事故。
结论:我该换用 TOML 吗?
这取决于你的具体场景:
- 如果你的项目配置非常简单,只有寥寥几行,那么继续使用
JSON 完全没问题。
- 如果你的配置结构非常复杂、嵌套很深,并且主要由程序生成和读取,很少需要人工干预,那么
YAML 或许还能胜任。
- 但如果你希望你的项目配置看起来更现代、更规范,或者你特别关心配置文件的可读性和可维护性,希望用户或协作者在修改配置时能轻松上手、少踩坑,那么切换到
TOML 会是一个值得考虑的选择。
技术的选择往往是对特定场景下利弊权衡的结果。TOML 的流行,反映出开发者社区对“开发者体验”和“配置可靠性”的日益重视。当你在云栈社区浏览或启动下一个开源项目时,不妨考虑一下它。