一个小 TOML 解析器
项目描述
汤姆利
一个小 TOML 解析器
使用mdformat-toc生成的目录
介绍
Tomli 是一个用于解析TOML的 Python 库。Tomli 与TOML v1.0.0完全兼容。
安装
pip install tomli
用法
解析 TOML 字符串
import tomli
toml_str = """
gretzky = 99
[kurri]
jari = 17
"""
toml_dict = tomli.loads(toml_str)
assert toml_dict == {"gretzky": 99, "kurri": {"jari": 17}}
解析 TOML 文件
import tomli
with open("path_to_file/conf.toml", "rb") as f:
toml_dict = tomli.load(f)
该文件必须以二进制模式打开(带有"rb"
标志)。二进制模式将强制将文件解码为 UTF-8 并禁用通用换行符,这两者都是正确解析 TOML 所必需的。
处理无效的 TOML
import tomli
try:
toml_dict = tomli.loads("]] this is invalid TOML [[")
except tomli.TOMLDecodeError:
print("Yep, definitely not valid.")
请注意,错误消息被视为仅供参考。不应假定它们在 Tomli 版本中保持不变。
decimal.Decimal
从 TOML 浮点数构造s
from decimal import Decimal
import tomli
toml_dict = tomli.loads("precision-matters = 0.982492", parse_float=Decimal)
assert toml_dict["precision-matters"] == Decimal("0.982492")
请注意,decimal.Decimal
可以替换为另一个将 TOML 浮点数从字符串转换为 Python 类型的可调用对象。decimal.Decimal
但是,对于不能容忍浮动误差的用例,这是一个实际的选择。
非法类型是dict
and list
,以及它们的子类型。如果产生非法类型,ValueError
将引发A。parse_float
常问问题
为什么是这个解析器?
- 这是律'
- 零依赖的纯 Python
- 最快的纯 Python 解析器*:比tomlkit快 15 倍,比 toml快2.4 倍
- 仅输出基本数据类型
- 100% 符合规范:通过 测试集中的所有测试, 即将合并到 TOML 存储库的官方合规性测试
- 彻底测试:100% 分支覆盖率
是否支持评论保留往返解析?
不。
该tomli.loads
函数返回一个dict
仅由标准库中的内置类型和类型填充的纯文本。保留注释需要返回自定义类型,因此不支持,至少tomli.loads
andtomli.load
函数不支持。
如果您需要保留风格,请查看TOML Kit 。
有dumps
,write
或encode
函数吗?
Tomli-W是 Tomli 的只写副本,提供dump
和dumps
功能。
核心库不包含写入功能,因为大多数 TOML 用例都是只读的,而 Tomli 打算做到最小。
TOML 类型如何映射到 Python 类型?
TOML 类型 | 蟒蛇类型 | 细节 |
---|---|---|
文档根目录 | dict |
|
钥匙 | str |
|
细绳 | str |
|
整数 | int |
|
漂浮 | float |
|
布尔值 | bool |
|
偏移日期时间 | datetime.datetime |
tzinfo 属性设置为一个实例datetime.timezone |
本地日期时间 | datetime.datetime |
tzinfo 属性设置为None |
当地日期 | datetime.date |
|
当地时间 | datetime.time |
|
大批 | list |
|
桌子 | dict |
|
内联表 | dict |
表现
此存储库中的benchmark/
文件夹包含用于比较各种 Python TOML 解析器的性能基准。基准测试可以使用tox -e benchmark-pypi
. 在我的个人计算机上运行基准测试会输出以下内容:
foo@bar:~/dev/tomli$ tox -e benchmark-pypi
benchmark-pypi installed: attrs==19.3.0,click==7.1.2,pytomlpp==1.0.2,qtoml==0.3.0,rtoml==0.7.0,toml==0.10.2,tomli==1.1.0,tomlkit==0.7.2
benchmark-pypi run-test-pre: PYTHONHASHSEED='2658546909'
benchmark-pypi run-test: commands[0] | python -c 'import datetime; print(datetime.date.today())'
2021-07-23
benchmark-pypi run-test: commands[1] | python --version
Python 3.8.10
benchmark-pypi run-test: commands[2] | python benchmark/run.py
Parsing data.toml 5000 times:
------------------------------------------------------
parser | exec time | performance (more is better)
-----------+------------+-----------------------------
rtoml | 0.901 s | baseline (100%)
pytomlpp | 1.08 s | 83.15%
tomli | 3.89 s | 23.15%
toml | 9.36 s | 9.63%
qtoml | 11.5 s | 7.82%
tomlkit | 56.8 s | 1.59%
解析器从最快到最慢排序,使用最快的解析器作为基线。Tomli 在所有纯 Python TOML 解析器中表现最好,仅输给了 pytomlpp(包装 C++)和 rtoml(包装 Rust)。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。