You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							206 lines
						
					
					
						
							8.7 KiB
						
					
					
				
			
		
		
	
	
							206 lines
						
					
					
						
							8.7 KiB
						
					
					
				Metadata-Version: 2.1
 | 
						|
Name: tomli
 | 
						|
Version: 2.0.1
 | 
						|
Summary: A lil' TOML parser
 | 
						|
Keywords: toml
 | 
						|
Author-email: Taneli Hukkinen <hukkin@users.noreply.github.com>
 | 
						|
Requires-Python: >=3.7
 | 
						|
Description-Content-Type: text/markdown
 | 
						|
Classifier: License :: OSI Approved :: MIT License
 | 
						|
Classifier: Operating System :: MacOS
 | 
						|
Classifier: Operating System :: Microsoft :: Windows
 | 
						|
Classifier: Operating System :: POSIX :: Linux
 | 
						|
Classifier: Programming Language :: Python :: 3 :: Only
 | 
						|
Classifier: Programming Language :: Python :: 3.7
 | 
						|
Classifier: Programming Language :: Python :: 3.8
 | 
						|
Classifier: Programming Language :: Python :: 3.9
 | 
						|
Classifier: Programming Language :: Python :: 3.10
 | 
						|
Classifier: Programming Language :: Python :: Implementation :: CPython
 | 
						|
Classifier: Programming Language :: Python :: Implementation :: PyPy
 | 
						|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
 | 
						|
Classifier: Typing :: Typed
 | 
						|
Project-URL: Changelog, https://github.com/hukkin/tomli/blob/master/CHANGELOG.md
 | 
						|
Project-URL: Homepage, https://github.com/hukkin/tomli
 | 
						|
 | 
						|
[](https://github.com/hukkin/tomli/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush)
 | 
						|
[](https://codecov.io/gh/hukkin/tomli)
 | 
						|
[](https://pypi.org/project/tomli)
 | 
						|
 | 
						|
# Tomli
 | 
						|
 | 
						|
> A lil' TOML parser
 | 
						|
 | 
						|
**Table of Contents**  *generated with [mdformat-toc](https://github.com/hukkin/mdformat-toc)*
 | 
						|
 | 
						|
<!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=2 -->
 | 
						|
 | 
						|
- [Intro](#intro)
 | 
						|
- [Installation](#installation)
 | 
						|
- [Usage](#usage)
 | 
						|
  - [Parse a TOML string](#parse-a-toml-string)
 | 
						|
  - [Parse a TOML file](#parse-a-toml-file)
 | 
						|
  - [Handle invalid TOML](#handle-invalid-toml)
 | 
						|
  - [Construct `decimal.Decimal`s from TOML floats](#construct-decimaldecimals-from-toml-floats)
 | 
						|
- [FAQ](#faq)
 | 
						|
  - [Why this parser?](#why-this-parser)
 | 
						|
  - [Is comment preserving round-trip parsing supported?](#is-comment-preserving-round-trip-parsing-supported)
 | 
						|
  - [Is there a `dumps`, `write` or `encode` function?](#is-there-a-dumps-write-or-encode-function)
 | 
						|
  - [How do TOML types map into Python types?](#how-do-toml-types-map-into-python-types)
 | 
						|
- [Performance](#performance)
 | 
						|
 | 
						|
<!-- mdformat-toc end -->
 | 
						|
 | 
						|
## Intro<a name="intro"></a>
 | 
						|
 | 
						|
Tomli is a Python library for parsing [TOML](https://toml.io).
 | 
						|
Tomli is fully compatible with [TOML v1.0.0](https://toml.io/en/v1.0.0).
 | 
						|
 | 
						|
## Installation<a name="installation"></a>
 | 
						|
 | 
						|
```bash
 | 
						|
pip install tomli
 | 
						|
```
 | 
						|
 | 
						|
## Usage<a name="usage"></a>
 | 
						|
 | 
						|
### Parse a TOML string<a name="parse-a-toml-string"></a>
 | 
						|
 | 
						|
```python
 | 
						|
import tomli
 | 
						|
 | 
						|
toml_str = """
 | 
						|
           gretzky = 99
 | 
						|
 | 
						|
           [kurri]
 | 
						|
           jari = 17
 | 
						|
           """
 | 
						|
 | 
						|
toml_dict = tomli.loads(toml_str)
 | 
						|
assert toml_dict == {"gretzky": 99, "kurri": {"jari": 17}}
 | 
						|
```
 | 
						|
 | 
						|
### Parse a TOML file<a name="parse-a-toml-file"></a>
 | 
						|
 | 
						|
```python
 | 
						|
import tomli
 | 
						|
 | 
						|
with open("path_to_file/conf.toml", "rb") as f:
 | 
						|
    toml_dict = tomli.load(f)
 | 
						|
```
 | 
						|
 | 
						|
The file must be opened in binary mode (with the `"rb"` flag).
 | 
						|
Binary mode will enforce decoding the file as UTF-8 with universal newlines disabled,
 | 
						|
both of which are required to correctly parse TOML.
 | 
						|
 | 
						|
### Handle invalid TOML<a name="handle-invalid-toml"></a>
 | 
						|
 | 
						|
```python
 | 
						|
import tomli
 | 
						|
 | 
						|
try:
 | 
						|
    toml_dict = tomli.loads("]] this is invalid TOML [[")
 | 
						|
except tomli.TOMLDecodeError:
 | 
						|
    print("Yep, definitely not valid.")
 | 
						|
```
 | 
						|
 | 
						|
Note that error messages are considered informational only.
 | 
						|
They should not be assumed to stay constant across Tomli versions.
 | 
						|
 | 
						|
### Construct `decimal.Decimal`s from TOML floats<a name="construct-decimaldecimals-from-toml-floats"></a>
 | 
						|
 | 
						|
```python
 | 
						|
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")
 | 
						|
```
 | 
						|
 | 
						|
Note that `decimal.Decimal` can be replaced with another callable that converts a TOML float from string to a Python type.
 | 
						|
The `decimal.Decimal` is, however, a practical choice for use cases where float inaccuracies can not be tolerated.
 | 
						|
 | 
						|
Illegal types are `dict` and `list`, and their subtypes.
 | 
						|
A `ValueError` will be raised if `parse_float` produces illegal types.
 | 
						|
 | 
						|
## FAQ<a name="faq"></a>
 | 
						|
 | 
						|
### Why this parser?<a name="why-this-parser"></a>
 | 
						|
 | 
						|
- it's lil'
 | 
						|
- pure Python with zero dependencies
 | 
						|
- the fastest pure Python parser [\*](#performance):
 | 
						|
  15x as fast as [tomlkit](https://pypi.org/project/tomlkit/),
 | 
						|
  2.4x as fast as [toml](https://pypi.org/project/toml/)
 | 
						|
- outputs [basic data types](#how-do-toml-types-map-into-python-types) only
 | 
						|
- 100% spec compliant: passes all tests in
 | 
						|
  [a test set](https://github.com/toml-lang/compliance/pull/8)
 | 
						|
  soon to be merged to the official
 | 
						|
  [compliance tests for TOML](https://github.com/toml-lang/compliance)
 | 
						|
  repository
 | 
						|
- thoroughly tested: 100% branch coverage
 | 
						|
 | 
						|
### Is comment preserving round-trip parsing supported?<a name="is-comment-preserving-round-trip-parsing-supported"></a>
 | 
						|
 | 
						|
No.
 | 
						|
 | 
						|
The `tomli.loads` function returns a plain `dict` that is populated with builtin types and types from the standard library only.
 | 
						|
Preserving comments requires a custom type to be returned so will not be supported,
 | 
						|
at least not by the `tomli.loads` and `tomli.load` functions.
 | 
						|
 | 
						|
Look into [TOML Kit](https://github.com/sdispater/tomlkit) if preservation of style is what you need.
 | 
						|
 | 
						|
### Is there a `dumps`, `write` or `encode` function?<a name="is-there-a-dumps-write-or-encode-function"></a>
 | 
						|
 | 
						|
[Tomli-W](https://github.com/hukkin/tomli-w) is the write-only counterpart of Tomli, providing `dump` and `dumps` functions.
 | 
						|
 | 
						|
The core library does not include write capability, as most TOML use cases are read-only, and Tomli intends to be minimal.
 | 
						|
 | 
						|
### How do TOML types map into Python types?<a name="how-do-toml-types-map-into-python-types"></a>
 | 
						|
 | 
						|
| TOML type        | Python type         | Details                                                      |
 | 
						|
| ---------------- | ------------------- | ------------------------------------------------------------ |
 | 
						|
| Document Root    | `dict`              |                                                              |
 | 
						|
| Key              | `str`               |                                                              |
 | 
						|
| String           | `str`               |                                                              |
 | 
						|
| Integer          | `int`               |                                                              |
 | 
						|
| Float            | `float`             |                                                              |
 | 
						|
| Boolean          | `bool`              |                                                              |
 | 
						|
| Offset Date-Time | `datetime.datetime` | `tzinfo` attribute set to an instance of `datetime.timezone` |
 | 
						|
| Local Date-Time  | `datetime.datetime` | `tzinfo` attribute set to `None`                             |
 | 
						|
| Local Date       | `datetime.date`     |                                                              |
 | 
						|
| Local Time       | `datetime.time`     |                                                              |
 | 
						|
| Array            | `list`              |                                                              |
 | 
						|
| Table            | `dict`              |                                                              |
 | 
						|
| Inline Table     | `dict`              |                                                              |
 | 
						|
 | 
						|
## Performance<a name="performance"></a>
 | 
						|
 | 
						|
The `benchmark/` folder in this repository contains a performance benchmark for comparing the various Python TOML parsers.
 | 
						|
The benchmark can be run with `tox -e benchmark-pypi`.
 | 
						|
Running the benchmark on my personal computer output the following:
 | 
						|
 | 
						|
```console
 | 
						|
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%
 | 
						|
```
 | 
						|
 | 
						|
The parsers are ordered from fastest to slowest, using the fastest parser as baseline.
 | 
						|
Tomli performed the best out of all pure Python TOML parsers,
 | 
						|
losing only to pytomlpp (wraps C++) and rtoml (wraps Rust).
 | 
						|
 | 
						|
 |