Skip to main content

一个小 TOML 解析器

项目描述

构建状态 编解码器.io PyPI 版本

汤姆利

一个小 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但是,对于不能容忍浮动误差的用例,这是一个实际的选择。

非法类型是dictand list,以及它们的子类型。如果产生非法类型,ValueError将引发A。parse_float

常问问题

为什么是这个解析器?

  • 这是律'
  • 零依赖的纯 Python
  • 最快的纯 Python 解析器*:比tomlkit快 15 倍,比 toml快2.4 倍
  • 仅输出基本数据类型
  • 100% 符合规范:通过 测试集中的所有测试, 即将合并到 TOML 存储库的官方合规性测试
  • 彻底测试:100% 分支覆盖率

是否支持评论保留往返解析?

不。

tomli.loads函数返回一个dict仅由标准库中的内置类型和类型填充的纯文本。保留注释需要返回自定义类型,因此不支持,至少tomli.loadsandtomli.load函数不支持。

如果您需要保留风格,请查看TOML Kit 。

dumps,writeencode函数吗?

Tomli-W是 Tomli 的只写副本,提供dumpdumps功能。

核心库不包含写入功能,因为大多数 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)。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

tomli-2.0.1.tar.gz (15.2 kB 查看哈希)

已上传 source

内置分布

tomli-2.0.1-py3-none-any.whl (12.8 kB 查看哈希

已上传 py3