「TF」03 TOML:面向未来的配置语言

Greetings!

嗨!这里是阿乎的博客!(> ▽ <) /~

只要你和开源项目打过交道,就免不了要和各种配置文件亲密接触。
这些文件的格式五花八门——常见的有 JSONYAMLINI……

但近几年,一个新面孔在 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 621pyproject.toml 定为项目元数据的核心入口;
  • 新一代的 uvpoetry,以及主流的 blackruff 等工具,都把它作为首选配置文件。

对我来说,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 文件。

  1. 新建一个 config.toml
[server]
host = "127.0.0.1"
port = 8000
  1. Python 3.11+ 用户,直接使用内置 tomllib 库:
import tomllib

with open("config.toml", "rb") as f:
    cfg = tomllib.load(f)

print(cfg["server"]["port"])  # 8000
  1. 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,而是一种防御式选择
当整个生态都在向它靠拢时,提前熟悉它,总比日后被迫追赶来得从容。😎


Reference


「TF」03 TOML:面向未来的配置语言
https://siriusahu.github.io.git/2025/09/15/TF-03-TOML/
Author
Sirius Ahu
Posted on
September 15, 2025
Licensed under