一个小型的TOML解析器
项目描述
Tomli
一个小型的TOML解析器
目录 由mdformat-toc生成
简介
Tomli 是一个用于解析 TOML 的 Python 库。它与 TOML v1.0.0 完全兼容。
Python 3.11 通过 PEP 680 添加了 Tomli 的一个版本,即 tomllib
模块。Tomli 继续在 PyPI 上为那些标准库模块不可用且尚未达到生命周期的 Python 版本提供回端口。
安装
pip install tomli
使用
解析 TOML 字符串
import tomli
toml_str = """
[[players]]
name = "Lehtinen"
number = 26
[[players]]
name = "Numminen"
number = 27
"""
toml_dict = tomli.loads(toml_str)
assert toml_dict == {
"players": [{"name": "Lehtinen", "number": 26}, {"name": "Numminen", "number": 27}]
}
解析 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 版本之间保持恒定。
从 TOML 浮点数构建 decimal.Decimal
from decimal import Decimal
import tomli
toml_dict = tomli.loads("precision-matters = 0.982492", parse_float=Decimal)
assert isinstance(toml_dict["precision-matters"], Decimal)
assert toml_dict["precision-matters"] == Decimal("0.982492")
请注意,可以将 decimal.Decimal
替换为另一个可调用的函数,该函数将 TOML 浮点字符串转换为 Python 类型。然而,对于不能容忍浮点数不精确的用例,decimal.Decimal
是一个实际的选择。
非法类型是 dict
和 list
,以及它们的子类型。如果 parse_float
生成非法类型,将引发 ValueError
。
构建 tomli
/tomllib
兼容层
Python 3.11+ 版本附带 Tomli 版本:标准库模块 tomllib
。要构建在可用的标准库中使用的代码,但仍然与 Python 3.6+ 无缝工作,请执行以下操作。
不要使用硬 Tomli 依赖关系,而是使用以下 依赖指定符 仅在标准库模块不可用时要求 Tomli
tomli >= 1.1.0 ; python_version < "3.11"
然后,在您的代码中,使用以下回退机制导入 TOML 解析器
import sys
if sys.version_info >= (3, 11):
import tomllib
else:
import tomli as tomllib
tomllib.loads("['This parses fine with Python 3.6+']")
常见问题解答
为什么是这个解析器?
- it's lil'
- 纯 Python,无任何依赖
- 最快的纯 Python 解析器 *:比 tomlkit 快 16 倍,比 toml 快 2.3 倍
- 仅输出 基本数据类型
- 100% 规范兼容:通过 BurntSushi/toml-test 测试套件中的所有测试
- 彻底测试:100% 分支覆盖率
是否支持保留注释的往返解析?
不支持。
tomli.loads
函数返回一个普通的 dict
,其中填充了内置类型和标准库中的类型。保留注释需要返回一个自定义类型,因此不会支持,至少不会由 tomli.loads
和 tomli.load
函数支持。
如果需要保留风格,请查看 TOML Kit。
是否有 dumps
、write
或 encode
函数?
Tomli-W 是 Tomli 的写入对应版本,提供 dump
和 dumps
函数。
核心库不包括写入功能,因为大多数 TOML 用例是只读的,而 Tomli 旨在最小化。
如何将 TOML 类型映射到 Python 类型?
TOML 类型 | Python 类型 | 详细信息 |
---|---|---|
文档根 | dict |
|
键 | str |
|
字符串 | str |
|
整数 | int |
|
浮点数 | float |
|
布尔值 | bool |
|
偏移日期和时间 | datetime.datetime |
tzinfo 属性设置为 datetime.timezone 的一个实例 |
本地日期和时间 | datetime.datetime |
tzinfo 属性设置为 None |
本地日期 | datetime.date |
|
本地时间 | datetime.time |
|
数组 | 列表 |
|
表格 | dict |
|
内嵌表格 | dict |
性能
该存储库中的 benchmark/
文件夹包含各种 Python TOML 解析器的性能基准。可以使用 tox -e benchmark-pypi
运行基准测试。在我的个人电脑上运行基准测试的输出如下
foo@bar:~/dev/tomli$ tox -e benchmark-pypi
benchmark-pypi installed: attrs==21.4.0,click==8.0.3,pytomlpp==1.0.10,qtoml==0.3.1,rtoml==0.7.1,toml==0.10.2,tomli==2.0.1,tomlkit==0.9.2
benchmark-pypi run-test-pre: PYTHONHASHSEED='3088452573'
benchmark-pypi run-test: commands[0] | python -c 'import datetime; print(datetime.date.today())'
2022-02-09
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.891 s | baseline (100%)
pytomlpp | 0.969 s | 91.90%
tomli | 4 s | 22.25%
toml | 9.01 s | 9.88%
qtoml | 11.1 s | 8.05%
tomlkit | 63 s | 1.41%
解析器按照从快到慢的顺序排序,使用最快的解析器作为基准。Tomli 在所有纯 Python TOML 解析器中表现最佳,仅输给了 pytomlpp(C++ 包装)和 rtoml(Rust 包装)。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
构建分发
tomli-2.0.2.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed |
|
MD5 | e65b234adc4513d94792c69bb025b622 |
|
BLAKE2b-256 | 35b9de2a5c0144d7d75a57ff355c0c24054f965b2dc3036456ae03a51ea6264b |
tomli-2.0.2-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38 |
|
MD5 | 4f754cef5d3085b01ccd031675274317 |
|
BLAKE2b-256 | cfdbce8eda256fa131af12e0a76d481711abe4681b6923c27efb9a255c9e4594 |