Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions newsfragments/5257.feature.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Speed up setuptools imports on Python 3.15+ by adding ``__lazy_modules__`` -- by :user:`Avasam`
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ check = [

# Deprecated rules must now be selected by exact rule code
"ruff >= 0.13.0; sys_platform != 'cygwin'",
"flake8-lazy", # Until Ruff gains support for automatically inserting and validating __lazy_modules__

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

]

cover = [
Expand Down
1 change: 1 addition & 0 deletions ruff.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ exclude = [
]

[lint]
external=["LZY"]
extend-select = [
# upstream

Expand Down
11 changes: 11 additions & 0 deletions setuptools/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@

from __future__ import annotations

__lazy_modules__ = {
"collections",
"collections.abc",
f"{__spec__.parent}.depends",
f"{__spec__.parent}.dist",
f"{__spec__.parent}.extension",
f"{__spec__.parent}.version",
f"{__spec__.parent}.warnings",
"functools",
}

import functools
import os
import sys
Expand Down
16 changes: 16 additions & 0 deletions setuptools/_core_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,22 @@

from __future__ import annotations

__lazy_modules__ = {
"distutils",
"distutils.util",
"email",
"email.message",
f"{__spec__.parent}._static",
f"{__spec__.parent}.warnings",
"packaging",
"packaging.markers",
"packaging.requirements",
"packaging.utils",
"packaging.version",
"tempfile",
"textwrap",
}

import os
import stat
import textwrap
Expand Down
2 changes: 2 additions & 0 deletions setuptools/_discovery.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
__lazy_modules__ = {"functools", "operator", "packaging", "packaging.requirements"}

import functools
import operator

Expand Down
12 changes: 11 additions & 1 deletion setuptools/_entry_points.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
__lazy_modules__ = {
f"{__spec__.parent}._itertools",
f"{__spec__.parent}.errors",
"itertools",
"jaraco",
"jaraco.text",
"more_itertools",
"operator",
}

import functools
import itertools
import operator
Expand All @@ -6,7 +16,7 @@
from jaraco.text import yield_lines
from more_itertools import consume

from ._importlib import metadata
from ._importlib import metadata # noqa: LZY102
from ._itertools import ensure_unique
from .errors import OptionError

Expand Down
2 changes: 2 additions & 0 deletions setuptools/_imp.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from the deprecated imp module.
"""

__lazy_modules__ = {"importlib", "importlib.machinery", "importlib.util", "tokenize"}

import importlib.machinery
import importlib.util
import os
Expand Down
4 changes: 2 additions & 2 deletions setuptools/_importlib.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
import importlib.metadata as metadata # noqa: F401
import importlib.resources as resources # noqa: F401
import importlib.metadata as metadata # noqa: F401,LZY101
import importlib.resources as resources # noqa: F401,LZY101
2 changes: 2 additions & 0 deletions setuptools/_itertools.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
__lazy_modules__ = {"more_itertools"}

from more_itertools import consume # noqa: F401


Expand Down
2 changes: 2 additions & 0 deletions setuptools/_normalization.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
and core metadata
"""

__lazy_modules__ = {"packaging"}

import re
from typing import TYPE_CHECKING

Expand Down
2 changes: 2 additions & 0 deletions setuptools/_path.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from __future__ import annotations

__lazy_modules__ = {"more_itertools"}

import contextlib
import os
import sys
Expand Down
2 changes: 2 additions & 0 deletions setuptools/_reqs.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from __future__ import annotations

__lazy_modules__ = {"jaraco", "jaraco.text"}

from collections.abc import Callable, Iterable, Iterator
from functools import lru_cache
from typing import TYPE_CHECKING, TypeVar, overload
Expand Down
18 changes: 17 additions & 1 deletion setuptools/_scripts.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
from __future__ import annotations

__lazy_modules__ = {
"collections",
"collections.abc",
"distutils",
"distutils.command",
"distutils.command.build_scripts",
"distutils.util",
f"{__spec__.parent}.warnings",
"re",
"shlex",
"shutil",
"struct",
"subprocess",
"textwrap",
}

import os
import re
import shlex
Expand All @@ -11,7 +27,7 @@
from collections.abc import Iterable
from typing import TYPE_CHECKING, TypedDict

from ._importlib import metadata, resources
from ._importlib import metadata, resources # noqa: LZY102

if TYPE_CHECKING:
from typing_extensions import Self
Expand Down
7 changes: 7 additions & 0 deletions setuptools/_shutil.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
"""Convenience layer on top of stdlib's shutil and os"""

__lazy_modules__ = {
"collections",
"collections.abc",
"distutils",
f"{__spec__.parent}.compat",
}

import os
import stat
from collections.abc import Callable
Expand Down
2 changes: 2 additions & 0 deletions setuptools/_static.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
__lazy_modules__ = {f"{__spec__.parent}.warnings", "functools"}

from functools import wraps
from typing import TypeVar

Expand Down
8 changes: 8 additions & 0 deletions setuptools/archive_util.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
"""Utilities for extracting common archive formats"""

__lazy_modules__ = {
"contextlib",
f"{__spec__.parent}._path",
"shutil",
"tarfile",
"zipfile",
}

import contextlib
import os
import posixpath
Expand Down
14 changes: 14 additions & 0 deletions setuptools/build_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,20 @@

from __future__ import annotations

__lazy_modules__ = {
"distutils",
"distutils.util",
f"{__spec__.parent}._path",
f"{__spec__.parent}._reqs",
"io",
"pathlib",
"shlex",
"shutil",
"tempfile",
"tokenize",
"warnings",
}

import contextlib
import io
import os
Expand Down
12 changes: 12 additions & 0 deletions setuptools/command/_requirestxt.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@

from __future__ import annotations

__lazy_modules__ = {
"collections",
"collections.abc",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}._reqs",
"io",
"itertools",
"jaraco",
"jaraco.text",
"packaging",
"packaging.requirements",
}

import io
from collections import defaultdict
from collections.abc import Mapping
Expand Down
2 changes: 2 additions & 0 deletions setuptools/command/alias.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
__lazy_modules__ = {"distutils", "distutils.errors"}

from setuptools.command.setopt import config_file, edit_config, option_base

from distutils.errors import DistutilsOptionError
Expand Down
13 changes: 13 additions & 0 deletions setuptools/command/bdist_egg.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,19 @@

from __future__ import annotations

__lazy_modules__ = {
"collections",
"collections.abc",
"distutils",
"distutils.dir_util",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}._path",
"re",
"setuptools.extension",
"sysconfig",
"textwrap",
"types",
}

import marshal
import os
import re
Expand Down
5 changes: 5 additions & 0 deletions setuptools/command/bdist_rpm.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
__lazy_modules__ = {
f"{(__spec__.parent or '').rsplit('.', 1)[0]}.dist",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}.warnings",
}

from ..dist import Distribution
from ..warnings import SetuptoolsDeprecationWarning

Expand Down
23 changes: 23 additions & 0 deletions setuptools/command/bdist_wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,29 @@

from __future__ import annotations

__lazy_modules__ = {
"collections",
"collections.abc",
"distutils",
"email",
"email.generator",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}._core_metadata",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}._normalization",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}.warnings",
f"{__spec__.parent}.egg_info",
"glob",
"packaging",
"re",
"shutil",
"struct",
"sysconfig",
"typing",
"warnings",
"wheel",
"wheel.wheelfile",
"zipfile",
}

import os
import re
import shutil
Expand Down
2 changes: 2 additions & 0 deletions setuptools/command/build.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from __future__ import annotations

__lazy_modules__ = {f"{(__spec__.parent or '').rsplit('.', 1)[0]}.dist"}

from typing import Protocol

from ..dist import Distribution
Expand Down
7 changes: 7 additions & 0 deletions setuptools/command/build_clib.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
__lazy_modules__ = {
"distutils",
"distutils.errors",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}.dist",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}.modified",
}

from ..dist import Distribution
from ..modified import newer_pairwise_group

Expand Down
17 changes: 17 additions & 0 deletions setuptools/command/build_ext.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
from __future__ import annotations

__lazy_modules__ = {
"collections",
"collections.abc",
"distutils",
"distutils.ccompiler",
"importlib",
"importlib.machinery",
"importlib.util",
"itertools",
"operator",
"pathlib",
"setuptools.dist",
"setuptools.errors",
"setuptools.extension",
"textwrap",
}

import itertools
import operator
import os
Expand Down
20 changes: 20 additions & 0 deletions setuptools/command/build_py.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
from __future__ import annotations

__lazy_modules__ = {
"collections",
"collections.abc",
"distutils",
"distutils.errors",
"distutils.util",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}._path",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}.dist",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}.warnings",
"fnmatch",
"functools",
"glob",
"itertools",
"more_itertools",
"operator",
"pathlib",
"textwrap",
"typing",
}

import fnmatch
import itertools
import operator
Expand Down
2 changes: 2 additions & 0 deletions setuptools/command/develop.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
__lazy_modules__ = {"subprocess", "typing"}

import site
import subprocess
import sys
Expand Down
10 changes: 10 additions & 0 deletions setuptools/command/dist_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
As defined in the wheel specification
"""

__lazy_modules__ = {
"contextlib",
"distutils",
f"{(__spec__.parent or '').rsplit('.', 1)[0]}._shutil",
f"{__spec__.parent}.egg_info",
"pathlib",
"shutil",
"typing",
}

import os
import shutil
from contextlib import contextmanager
Expand Down
2 changes: 2 additions & 0 deletions setuptools/command/easy_install.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
__lazy_modules__ = {"types"}

import os
import sys
import types
Expand Down
Loading
Loading