aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/tomllib/_parser.py
diff options
context:
space:
mode:
authorTaneli Hukkinen <3275109+hukkin@users.noreply.github.com>2025-01-17 04:48:42 +0200
committerGitHub <noreply@github.com>2025-01-16 18:48:42 -0800
commitea6cc26e759704ac69cda07740cd484bf96596ca (patch)
tree5c7c9bc185e915fd8ee0159287d9a13f5ec518f8 /Lib/tomllib/_parser.py
parentc879de71eb4d5e88c289b654a08fc4e4dafa3b05 (diff)
downloadcpython-ea6cc26e759704ac69cda07740cd484bf96596ca.tar.gz
cpython-ea6cc26e759704ac69cda07740cd484bf96596ca.zip
gh-118761: Improve import time of `tomllib` (#128907)
Improve import time of `tomllib` (in sync with upstream)
Diffstat (limited to 'Lib/tomllib/_parser.py')
-rw-r--r--Lib/tomllib/_parser.py31
1 files changed, 19 insertions, 12 deletions
diff --git a/Lib/tomllib/_parser.py b/Lib/tomllib/_parser.py
index 4d208bcfb4a..0e522c3a69e 100644
--- a/Lib/tomllib/_parser.py
+++ b/Lib/tomllib/_parser.py
@@ -4,11 +4,7 @@
from __future__ import annotations
-from collections.abc import Iterable
-import string
from types import MappingProxyType
-from typing import Any, BinaryIO, NamedTuple
-import warnings
from ._re import (
RE_DATETIME,
@@ -18,7 +14,13 @@ from ._re import (
match_to_localtime,
match_to_number,
)
-from ._types import Key, ParseFloat, Pos
+
+TYPE_CHECKING = False
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+ from typing import IO, Any
+
+ from ._types import Key, ParseFloat, Pos
ASCII_CTRL = frozenset(chr(i) for i in range(32)) | frozenset(chr(127))
@@ -34,9 +36,11 @@ ILLEGAL_COMMENT_CHARS = ILLEGAL_BASIC_STR_CHARS
TOML_WS = frozenset(" \t")
TOML_WS_AND_NEWLINE = TOML_WS | frozenset("\n")
-BARE_KEY_CHARS = frozenset(string.ascii_letters + string.digits + "-_")
+BARE_KEY_CHARS = frozenset(
+ "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789" "-_"
+)
KEY_INITIAL_CHARS = BARE_KEY_CHARS | frozenset("\"'")
-HEXDIGIT_CHARS = frozenset(string.hexdigits)
+HEXDIGIT_CHARS = frozenset("abcdef" "ABCDEF" "0123456789")
BASIC_STR_ESCAPE_REPLACEMENTS = MappingProxyType(
{
@@ -80,6 +84,8 @@ class TOMLDecodeError(ValueError):
or not isinstance(doc, str)
or not isinstance(pos, int)
):
+ import warnings
+
warnings.warn(
"Free-form arguments for TOMLDecodeError are deprecated. "
"Please set 'msg' (str), 'doc' (str) and 'pos' (int) arguments only.",
@@ -115,7 +121,7 @@ class TOMLDecodeError(ValueError):
self.colno = colno
-def load(fp: BinaryIO, /, *, parse_float: ParseFloat = float) -> dict[str, Any]:
+def load(fp: IO[bytes], /, *, parse_float: ParseFloat = float) -> dict[str, Any]:
"""Parse TOML from a binary file object."""
b = fp.read()
try:
@@ -139,7 +145,7 @@ def loads(s: str, /, *, parse_float: ParseFloat = float) -> dict[str, Any]: # n
f"Expected str object, not '{type(s).__qualname__}'"
) from None
pos = 0
- out = Output(NestedDict(), Flags())
+ out = Output()
header: Key = ()
parse_float = make_safe_parse_float(parse_float)
@@ -290,9 +296,10 @@ class NestedDict:
cont[last_key] = [{}]
-class Output(NamedTuple):
- data: NestedDict
- flags: Flags
+class Output:
+ def __init__(self) -> None:
+ self.data = NestedDict()
+ self.flags = Flags()
def skip_chars(src: str, pos: Pos, chars: Iterable[str]) -> Pos: