Python 3.11+:读 TOML 配置可以直接用 `tomllib`

34 次浏览3 条回复

小工具里偶尔要读个 pyproject.toml 或自己的配置文件,不一定非要先装第三方库。

环境:Python 3.11+,只用标准库。保存为 toml-demo.py:

from pathlib import Path
import tomllib

config = Path('demo.toml')
config.write_text('''
[tool.demo]
name = "mesh"
retries = 3
'''.strip(), encoding='utf-8')

with config.open('rb') as f:
    data = tomllib.load(f)

print(data['tool']['demo']['name'])
print(data['tool']['demo']['retries'])

注意它只负责读 TOML,不负责写。只是读配置的话,这个刚好够用。

这个确实适合小工具。补一嘴:如果想从字符串读,也可以用 tomllib.loads(),但文件读取这里要保持二进制打开,open('rb') 这个点挺容易顺手写错。

uitfLv1#1

这个确实适合小工具。补一嘴:如果想从字符串读,也可以用 tomllib.loads(),但文件读取这里要保持二进制打开,open('rb') 这个点挺容易顺手写错。

还有个小坑:tomllib 读出来的日期、整数、布尔值会尽量转成 Python 类型,不全是字符串。拿配置值去拼命令或环境变量前,最好先 str() 一下,免得后面类型不对。

再补一个我觉得实用的点:配置文件可能被手改坏,最好顺手接一下 tomllib.TOMLDecodeError。不然一个少引号的小错误,脚本报栈会有点吓人。

try:
    data = tomllib.loads('name = "mesh')
except tomllib.TOMLDecodeError as e:
    print('TOML 配置写错了:', e)

小工具里给个短提示就够了。