From 0b3621f385d9e96dbe32593777969c942febfb04 Mon Sep 17 00:00:00 2001 From: mayeut Date: Sun, 24 May 2026 20:11:18 +0200 Subject: [PATCH] chore: avoid importing TYPE_CHECKING --- benchmarks/__init__.py | 6 +++--- noxfile.py | 3 ++- pyproject.toml | 3 +++ src/packaging/_elffile.py | 5 ++++- src/packaging/_manylinux.py | 3 ++- src/packaging/_musllinux.py | 3 ++- src/packaging/_ranges.py | 8 ++------ src/packaging/_tokenizer.py | 3 ++- src/packaging/direct_url.py | 22 ++++++++++------------ src/packaging/errors.py | 5 ++++- src/packaging/markers.py | 3 ++- src/packaging/metadata.py | 3 ++- src/packaging/pylock.py | 2 +- src/packaging/requirements.py | 3 +-- src/packaging/specifiers.py | 14 +++++++------- src/packaging/tags.py | 7 ++----- src/packaging/version.py | 8 ++++---- tests/property/test_specifier_extended.py | 5 ++--- tests/test_dependency_groups.py | 17 ++++++++++------- tests/test_manylinux.py | 7 ++++--- tests/test_metadata.py | 4 ++-- tests/test_musllinux.py | 3 ++- tests/test_pylock_select.py | 3 ++- tests/test_specifiers.py | 3 ++- tests/test_tags.py | 3 ++- tests/test_version.py | 3 ++- 26 files changed, 81 insertions(+), 68 deletions(-) diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py index 59e091894..bf1ea6041 100644 --- a/benchmarks/__init__.py +++ b/benchmarks/__init__.py @@ -1,11 +1,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, TypeVar - +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Callable + from typing import Any, TypeVar -F = TypeVar("F", bound="Callable[..., Any]") + F = TypeVar("F", bound="Callable[..., Any]") def add_attributes(**attrs: object) -> Callable[[F], F]: diff --git a/noxfile.py b/noxfile.py index c76d7a480..3fce3277a 100644 --- a/noxfile.py +++ b/noxfile.py @@ -20,14 +20,15 @@ import time import urllib.request from pathlib import Path -from typing import IO, TYPE_CHECKING import nox import packaging.version # will always be present with nox +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Generator + from typing import IO nox.needs_version = ">=2025.02.09" nox.options.reuse_existing_virtualenvs = True diff --git a/pyproject.toml b/pyproject.toml index d29f0211a..ce9149f09 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -156,6 +156,9 @@ ignore = [ flake8-comprehensions.allow-dict-calls-with-keyword-arguments = true flake8-unused-arguments.ignore-variadic-names = true +[tool.ruff.lint.flake8-tidy-imports.banned-api] +"typing.TYPE_CHECKING".msg = "Use TYPE_CHECKING=False instead" + [tool.ruff.lint.per-file-ignores] "tests/test_*.py" = ["PYI024", "PLR", "SIM201", "T20", "S301"] "tasks/*.py" = ["T20"] diff --git a/src/packaging/_elffile.py b/src/packaging/_elffile.py index 497b06452..b5548fa83 100644 --- a/src/packaging/_elffile.py +++ b/src/packaging/_elffile.py @@ -12,7 +12,10 @@ import enum import os import struct -from typing import IO + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import IO class ELFInvalid(ValueError): diff --git a/src/packaging/_manylinux.py b/src/packaging/_manylinux.py index 72b8f799d..a62e5d849 100644 --- a/src/packaging/_manylinux.py +++ b/src/packaging/_manylinux.py @@ -7,10 +7,11 @@ import re import sys import warnings -from typing import TYPE_CHECKING, NamedTuple +from typing import NamedTuple from ._elffile import EIClass, EIData, ELFFile, EMachine +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Generator, Iterator, Sequence diff --git a/src/packaging/_musllinux.py b/src/packaging/_musllinux.py index aed083ce9..30257afa5 100644 --- a/src/packaging/_musllinux.py +++ b/src/packaging/_musllinux.py @@ -10,10 +10,11 @@ import re import subprocess import sys -from typing import TYPE_CHECKING, NamedTuple +from typing import NamedTuple from ._elffile import ELFFile +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Iterator, Sequence diff --git a/src/packaging/_ranges.py b/src/packaging/_ranges.py index 5ab4c41e6..069427ecc 100644 --- a/src/packaging/_ranges.py +++ b/src/packaging/_ranges.py @@ -7,17 +7,13 @@ import enum import functools -from typing import ( - TYPE_CHECKING, - Any, - Final, -) from .version import InvalidVersion, Version +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Callable, Iterable, Iterator, Sequence - from typing import Union + from typing import Any, Final, Union __all__ = [ "FULL_RANGE", diff --git a/src/packaging/_tokenizer.py b/src/packaging/_tokenizer.py index f467fcf64..fab626a4c 100644 --- a/src/packaging/_tokenizer.py +++ b/src/packaging/_tokenizer.py @@ -3,12 +3,13 @@ import contextlib import re from dataclasses import dataclass -from typing import TYPE_CHECKING, NoReturn from .specifiers import Specifier +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Generator, Mapping + from typing import NoReturn @dataclass diff --git a/src/packaging/direct_url.py b/src/packaging/direct_url.py index 5d1c56ca9..ddedbd9a8 100644 --- a/src/packaging/direct_url.py +++ b/src/packaging/direct_url.py @@ -4,17 +4,26 @@ import re import urllib.parse from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Protocol, TypeVar +TYPE_CHECKING = False if TYPE_CHECKING: # pragma: no cover import sys from collections.abc import Collection + from typing import Any, Protocol, TypeVar if sys.version_info >= (3, 11): from typing import Self else: from typing_extensions import Self + _T = TypeVar("_T") + + class _FromMappingProtocol(Protocol): # pragma: no cover + @classmethod + def _from_dict(cls, d: Mapping[str, Any]) -> Self: ... + + _FromMappingProtocolT = TypeVar("_FromMappingProtocolT", bound=_FromMappingProtocol) + __all__ = [ "ArchiveInfo", "DirInfo", @@ -28,17 +37,6 @@ def __dir__() -> list[str]: return __all__ -_T = TypeVar("_T") - - -class _FromMappingProtocol(Protocol): # pragma: no cover - @classmethod - def _from_dict(cls, d: Mapping[str, Any]) -> Self: ... - - -_FromMappingProtocolT = TypeVar("_FromMappingProtocolT", bound=_FromMappingProtocol) - - def _json_dict_factory(data: list[tuple[str, Any]]) -> dict[str, Any]: return {key: value for key, value in data if value is not None} diff --git a/src/packaging/errors.py b/src/packaging/errors.py index d1d47cf6c..6476b2789 100644 --- a/src/packaging/errors.py +++ b/src/packaging/errors.py @@ -3,7 +3,10 @@ import contextlib import dataclasses import sys -import typing + +TYPE_CHECKING = False +if TYPE_CHECKING: + import typing __all__ = ["ExceptionGroup"] diff --git a/src/packaging/markers.py b/src/packaging/markers.py index 203838845..1df2f32c8 100644 --- a/src/packaging/markers.py +++ b/src/packaging/markers.py @@ -9,7 +9,7 @@ import platform import sys from collections.abc import Set as AbstractSet -from typing import TYPE_CHECKING, Callable, Literal, TypedDict, Union, cast +from typing import Callable, Literal, TypedDict, Union, cast from ._parser import MarkerAtom, MarkerList, Op, Value, Variable from ._parser import parse_marker as _parse_marker @@ -17,6 +17,7 @@ from .specifiers import InvalidSpecifier, Specifier from .utils import canonicalize_name +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Mapping diff --git a/src/packaging/metadata.py b/src/packaging/metadata.py index dccb627de..c3f74e6a8 100644 --- a/src/packaging/metadata.py +++ b/src/packaging/metadata.py @@ -20,7 +20,8 @@ from . import version as version_module from .errors import ExceptionGroup, _ErrorCollector -if typing.TYPE_CHECKING: +TYPE_CHECKING = False +if TYPE_CHECKING: from .licenses import NormalizedLicenseExpression T = typing.TypeVar("T") diff --git a/src/packaging/pylock.py b/src/packaging/pylock.py index 663f69687..6ef654f5f 100644 --- a/src/packaging/pylock.py +++ b/src/packaging/pylock.py @@ -7,7 +7,6 @@ from dataclasses import dataclass from datetime import datetime from typing import ( - TYPE_CHECKING, Any, Callable, Protocol, @@ -32,6 +31,7 @@ ) from .version import Version +TYPE_CHECKING = False if TYPE_CHECKING: # pragma: no cover from collections.abc import Collection, Iterator from pathlib import Path diff --git a/src/packaging/requirements.py b/src/packaging/requirements.py index 111d1ebc4..7f1777582 100644 --- a/src/packaging/requirements.py +++ b/src/packaging/requirements.py @@ -3,14 +3,13 @@ # for complete details. from __future__ import annotations -from typing import TYPE_CHECKING - from ._parser import parse_requirement as _parse_requirement from ._tokenizer import ParserSyntaxError from .markers import Marker, _normalize_extra_values from .specifiers import SpecifierSet from .utils import canonicalize_name +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Iterator diff --git a/src/packaging/specifiers.py b/src/packaging/specifiers.py index bfd45ee58..d9ebb6540 100644 --- a/src/packaging/specifiers.py +++ b/src/packaging/specifiers.py @@ -12,10 +12,8 @@ import abc import re -import sys import typing from typing import ( - TYPE_CHECKING, Any, Callable, Final, @@ -35,14 +33,16 @@ from .utils import canonicalize_version from .version import InvalidVersion, Version -if sys.version_info >= (3, 10): - from typing import TypeGuard # pragma: no cover -elif TYPE_CHECKING: - from typing_extensions import TypeGuard - +TYPE_CHECKING = False if TYPE_CHECKING: + import sys from collections.abc import Iterable, Iterator, Sequence + if sys.version_info >= (3, 10): + from typing import TypeGuard # pragma: no cover + elif TYPE_CHECKING: + from typing_extensions import TypeGuard + from ._ranges import VersionRange diff --git a/src/packaging/tags.py b/src/packaging/tags.py index ce2cf891d..8fc6e25e7 100644 --- a/src/packaging/tags.py +++ b/src/packaging/tags.py @@ -14,14 +14,11 @@ import sysconfig from collections.abc import Iterable, Iterator, Sequence from importlib.machinery import EXTENSION_SUFFIXES -from typing import ( - TYPE_CHECKING, - TypeVar, - cast, -) +from typing import TypeVar, cast from . import _manylinux, _musllinux +TYPE_CHECKING = False if TYPE_CHECKING: from collections.abc import Callable from collections.abc import Set as AbstractSet diff --git a/src/packaging/version.py b/src/packaging/version.py index ee5aa48fd..9d0d0a1cd 100644 --- a/src/packaging/version.py +++ b/src/packaging/version.py @@ -11,7 +11,6 @@ import re import sys -import typing from typing import ( Any, Callable, @@ -22,12 +21,13 @@ Union, ) -if typing.TYPE_CHECKING: +TYPE_CHECKING = False +if TYPE_CHECKING: from typing_extensions import Self, Unpack if sys.version_info >= (3, 13): # pragma: no cover from warnings import deprecated as _deprecated -elif typing.TYPE_CHECKING: +elif TYPE_CHECKING: from typing_extensions import deprecated as _deprecated else: # pragma: no cover import functools @@ -137,7 +137,7 @@ class _BaseVersion: # This can also be a normal member (see the packaging_legacy package); # we are just requiring it to be readable. Actually defining a property # has runtime effect on subclasses, so it's typing only. - if typing.TYPE_CHECKING: + if TYPE_CHECKING: @property def _key(self) -> tuple[Any, ...]: ... diff --git a/tests/property/test_specifier_extended.py b/tests/property/test_specifier_extended.py index 864d10ea4..169673da0 100644 --- a/tests/property/test_specifier_extended.py +++ b/tests/property/test_specifier_extended.py @@ -4,8 +4,6 @@ from __future__ import annotations -import typing - import pytest from hypothesis import assume, given from hypothesis import strategies as st @@ -20,7 +18,8 @@ specifier_sets, ) -if typing.TYPE_CHECKING: +TYPE_CHECKING = False +if TYPE_CHECKING: from packaging.version import Version pytestmark = pytest.mark.property diff --git a/tests/test_dependency_groups.py b/tests/test_dependency_groups.py index de8f6caf6..16148b57d 100644 --- a/tests/test_dependency_groups.py +++ b/tests/test_dependency_groups.py @@ -1,9 +1,7 @@ from __future__ import annotations import re -import sys import unittest.mock -from typing import Any import pytest @@ -18,12 +16,17 @@ from packaging.errors import ExceptionGroup from packaging.requirements import Requirement -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias +TYPE_CHECKING = False +if TYPE_CHECKING: + import sys + from typing import Any -GroupsTable: TypeAlias = "dict[str, list[str | dict[str, str]]]" + if sys.version_info >= (3, 10): + from typing import TypeAlias + else: + from typing_extensions import TypeAlias + + GroupsTable: TypeAlias = "dict[str, list[str | dict[str, str]]]" def _group_contains( diff --git a/tests/test_manylinux.py b/tests/test_manylinux.py index 9768fd06d..1fbd5a5c9 100644 --- a/tests/test_manylinux.py +++ b/tests/test_manylinux.py @@ -12,9 +12,6 @@ import types import typing -if typing.TYPE_CHECKING: - from collections.abc import Generator - import pretend import pytest @@ -30,6 +27,10 @@ _parse_glibc_version, ) +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Generator + @pytest.fixture(autouse=True) def clear_lru_cache() -> Generator[None, None, None]: diff --git a/tests/test_metadata.py b/tests/test_metadata.py index f6783f93e..1d408ae4f 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -4,14 +4,14 @@ import inspect import pathlib import textwrap -import typing import pytest from packaging import metadata, requirements, specifiers, utils, version from packaging.errors import ExceptionGroup -if typing.TYPE_CHECKING: +TYPE_CHECKING = False +if TYPE_CHECKING: from packaging.metadata import RawMetadata diff --git a/tests/test_musllinux.py b/tests/test_musllinux.py index d90627262..4a12388a5 100644 --- a/tests/test_musllinux.py +++ b/tests/test_musllinux.py @@ -10,7 +10,8 @@ from packaging import _musllinux from packaging._musllinux import _get_musl_version, _MuslVersion, _parse_musl_version -if typing.TYPE_CHECKING: +TYPE_CHECKING = False +if TYPE_CHECKING: from collections.abc import Generator diff --git a/tests/test_pylock_select.py b/tests/test_pylock_select.py index c54a47102..92452c60e 100644 --- a/tests/test_pylock_select.py +++ b/tests/test_pylock_select.py @@ -3,7 +3,7 @@ import dataclasses import sys from pathlib import Path -from typing import TYPE_CHECKING, cast +from typing import cast import pytest @@ -27,6 +27,7 @@ else: import tomli as tomllib +TYPE_CHECKING = False if TYPE_CHECKING: from packaging.markers import Environment from packaging.utils import NormalizedName diff --git a/tests/test_specifiers.py b/tests/test_specifiers.py index bff261dcb..794eb1bde 100644 --- a/tests/test_specifiers.py +++ b/tests/test_specifiers.py @@ -18,7 +18,8 @@ from .test_version import VERSIONS -if typing.TYPE_CHECKING: +TYPE_CHECKING = False +if TYPE_CHECKING: from collections.abc import Callable LEGACY_SPECIFIERS = [ diff --git a/tests/test_tags.py b/tests/test_tags.py index f6bca2fdb..9ff63c92b 100644 --- a/tests/test_tags.py +++ b/tests/test_tags.py @@ -28,7 +28,8 @@ from packaging._manylinux import _GLibCVersion from packaging._musllinux import _MuslVersion -if typing.TYPE_CHECKING: +TYPE_CHECKING = False +if TYPE_CHECKING: from collections.abc import Callable diff --git a/tests/test_version.py b/tests/test_version.py index 9729298be..5d922717e 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -22,7 +22,8 @@ parse, ) -if typing.TYPE_CHECKING: +TYPE_CHECKING = False +if TYPE_CHECKING: from collections.abc import Callable from typing_extensions import Self, Unpack