https://github.com/python/cpython/commit/ea6cc26e759704ac69cda07740cd484bf96596ca
commit: ea6cc26e759704ac69cda07740cd484bf96596ca
branch: main
author: Taneli Hukkinen <[email protected]>
committer: gpshead <[email protected]>
date: 2025-01-16T18:48:42-08:00
summary:
gh-118761: Improve import time of `tomllib` (#128907)
Improve import time of `tomllib` (in sync with upstream)
files:
A Misc/NEWS.d/next/Library/2025-01-16-10-06-40.gh-issue-118761.z100LC.rst
M Lib/test/test_tomllib/test_misc.py
M Lib/tomllib/_parser.py
M Lib/tomllib/_re.py
diff --git a/Lib/test/test_tomllib/test_misc.py
b/Lib/test/test_tomllib/test_misc.py
index 9e677a337a2835..59116afa1f36ad 100644
--- a/Lib/test/test_tomllib/test_misc.py
+++ b/Lib/test/test_tomllib/test_misc.py
@@ -5,6 +5,7 @@
import copy
import datetime
from decimal import Decimal as D
+import importlib
from pathlib import Path
import sys
import tempfile
@@ -113,3 +114,11 @@ def test_inline_table_recursion_limit(self):
nest_count=nest_count):
recursive_table_toml = nest_count * "key = {" + nest_count *
"}"
tomllib.loads(recursive_table_toml)
+
+ def test_types_import(self):
+ """Test that `_types` module runs.
+
+ The module is for type annotations only, so it is otherwise
+ never imported by tests.
+ """
+ importlib.import_module(f"{tomllib.__name__}._types")
diff --git a/Lib/tomllib/_parser.py b/Lib/tomllib/_parser.py
index 4d208bcfb4a9a6..0e522c3a69e6fe 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 @@
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 @@
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 @@ def __init__(
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 @@ def __init__(
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 @@ def append_nest_to_list(self, key: Key) -> None:
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:
diff --git a/Lib/tomllib/_re.py b/Lib/tomllib/_re.py
index 9eacefc729544e..1ca6bef77a0b03 100644
--- a/Lib/tomllib/_re.py
+++ b/Lib/tomllib/_re.py
@@ -7,9 +7,12 @@
from datetime import date, datetime, time, timedelta, timezone, tzinfo
from functools import lru_cache
import re
-from typing import Any
-from ._types import ParseFloat
+TYPE_CHECKING = False
+if TYPE_CHECKING:
+ from typing import Any
+
+ from ._types import ParseFloat
# E.g.
# - 00:32:00.999999
diff --git
a/Misc/NEWS.d/next/Library/2025-01-16-10-06-40.gh-issue-118761.z100LC.rst
b/Misc/NEWS.d/next/Library/2025-01-16-10-06-40.gh-issue-118761.z100LC.rst
new file mode 100644
index 00000000000000..ea71ecaaeb2936
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-01-16-10-06-40.gh-issue-118761.z100LC.rst
@@ -0,0 +1,2 @@
+Improve import time of :mod:`tomllib` by removing ``typing``, ``string``,
+and ``tomllib._types`` imports. Patch by Taneli Hukkinen.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]