From 0b202aa0052a819bce727296504069794e7fc420 Mon Sep 17 00:00:00 2001
From: Nick Drozd <nicholasdrozd@gmail.com>
Date: Tue, 24 Sep 2024 14:43:54 -0400
Subject: [PATCH 1/3] Move typechecking imports under TYPE_CHECKING flag

---
 pylint/checkers/bad_chained_comparison.py     |  4 +-
 pylint/checkers/base/basic_checker.py         |  8 +--
 pylint/checkers/base/basic_error_checker.py   |  6 ++-
 pylint/checkers/base/docstring_checker.py     |  7 ++-
 pylint/checkers/base/name_checker/checker.py  |  9 ++--
 .../base/name_checker/naming_style.py         |  8 ++-
 pylint/checkers/base_checker.py               | 28 +++++-----
 pylint/checkers/classes/class_checker.py      | 20 ++++---
 .../classes/special_methods_checker.py        | 14 +++--
 pylint/checkers/deprecated.py                 |  9 +++-
 pylint/checkers/design_analysis.py            |  9 ++--
 pylint/checkers/exceptions.py                 | 16 +++---
 pylint/checkers/format.py                     |  8 +--
 pylint/checkers/imports.py                    | 13 +++--
 pylint/checkers/logging.py                    | 13 +++--
 pylint/checkers/misc.py                       |  6 +--
 pylint/checkers/newstyle.py                   |  3 +-
 pylint/checkers/non_ascii_names.py            |  7 ++-
 pylint/checkers/raw_metrics.py                | 10 ++--
 .../implicit_booleaness_checker.py            |  6 ++-
 .../refactoring/refactoring_checker.py        | 11 ++--
 pylint/checkers/spelling.py                   | 10 ++--
 pylint/checkers/stdlib.py                     | 14 +++--
 pylint/checkers/strings.py                    | 19 ++++---
 pylint/checkers/symilar.py                    | 15 ++++--
 pylint/checkers/typecheck.py                  | 33 +++++++-----
 pylint/checkers/unicode.py                    | 16 +++---
 pylint/checkers/utils.py                      | 21 ++++----
 pylint/checkers/variables.py                  | 19 ++++---
 pylint/config/_pylint_config/setup.py         |  7 ++-
 pylint/config/_pylint_config/utils.py         | 20 ++++---
 pylint/config/argument.py                     | 32 +++++++-----
 pylint/config/arguments_manager.py            | 10 ++--
 pylint/config/arguments_provider.py           | 11 ++--
 pylint/config/callback_actions.py             |  6 ++-
 pylint/config/config_initialization.py        |  2 +-
 pylint/config/deprecation_actions.py          |  7 ++-
 pylint/config/find_default_config_files.py    |  5 +-
 pylint/config/utils.py                        |  6 ++-
 pylint/constants.py                           |  6 ++-
 pylint/extensions/_check_docs_utils.py        |  5 +-
 pylint/extensions/check_elif.py               |  5 +-
 pylint/extensions/code_style.py               | 11 ++--
 pylint/extensions/docparams.py                |  5 +-
 pylint/extensions/docstyle.py                 |  3 +-
 pylint/extensions/dunder.py                   |  4 +-
 pylint/extensions/empty_comment.py            |  4 +-
 pylint/extensions/eq_without_hash.py          | 10 +++-
 pylint/extensions/mccabe.py                   | 52 ++++++++++---------
 pylint/extensions/overlapping_exceptions.py   |  8 ++-
 pylint/extensions/redefined_loop_name.py      |  6 ++-
 pylint/extensions/while_used.py               |  4 +-
 pylint/graph.py                               |  7 ++-
 pylint/lint/base_options.py                   |  2 +-
 pylint/lint/expand_modules.py                 |  9 ++--
 pylint/lint/message_state_handler.py          |  9 ++--
 pylint/lint/parallel.py                       | 13 +++--
 pylint/lint/pylinter.py                       | 46 +++++++++-------
 pylint/lint/report_functions.py               | 11 ++--
 pylint/lint/run.py                            | 11 ++--
 pylint/lint/utils.py                          |  5 +-
 pylint/message/message.py                     |  6 ++-
 pylint/message/message_definition.py          |  7 +--
 pylint/message/message_definition_store.py    |  5 +-
 pylint/message/message_id_store.py            |  5 +-
 pylint/pyreverse/diadefslib.py                | 12 +++--
 pylint/pyreverse/diagrams.py                  |  7 ++-
 pylint/pyreverse/dot_printer.py               |  6 ++-
 pylint/pyreverse/main.py                      | 11 ++--
 pylint/pyreverse/printer.py                   |  6 ++-
 pylint/pyreverse/printer_factory.py           |  7 ++-
 pylint/pyreverse/utils.py                     |  9 ++--
 pylint/pyreverse/writer.py                    | 25 +++++----
 pylint/reporters/base_reporter.py             |  8 +--
 pylint/reporters/multi_reporter.py            | 13 ++---
 pylint/reporters/reports_handler_mix_in.py    | 12 +++--
 pylint/reporters/text.py                      |  4 +-
 pylint/reporters/ureports/base_writer.py      |  6 ++-
 pylint/reporters/ureports/nodes.py            | 15 +++---
 pylint/testutils/_primer/package_to_lint.py   |  6 ++-
 pylint/testutils/_primer/primer.py            | 10 ++--
 pylint/testutils/_primer/primer_command.py    | 12 +++--
 .../_primer/primer_compare_command.py         | 11 ++--
 .../testutils/_primer/primer_run_command.py   | 13 +++--
 pylint/testutils/_run.py                      |  8 ++-
 pylint/testutils/checker_test_case.py         | 14 +++--
 pylint/testutils/decorator.py                 |  9 ++--
 .../functional/find_functional_tests.py       |  6 ++-
 .../functional/lint_module_output_update.py   |  8 ++-
 pylint/testutils/functional/test_file.py      |  6 ++-
 pylint/testutils/lint_module_test.py          | 16 ++++--
 pylint/testutils/output_line.py               | 17 +++---
 pylint/testutils/pyreverse.py                 |  6 ++-
 pylint/testutils/reporter_for_tests.py        |  2 +-
 pylint/testutils/tokenize_str.py              |  5 +-
 pylint/testutils/unittest_linter.py           | 13 +++--
 pylint/testutils/utils.py                     |  9 ++--
 pylint/utils/docs.py                          |  4 +-
 pylint/utils/file_state.py                    | 11 ++--
 pylint/utils/linterstats.py                   |  5 +-
 pylint/utils/pragma_parser.py                 |  6 ++-
 pylint/utils/utils.py                         | 17 +++---
 102 files changed, 692 insertions(+), 390 deletions(-)

diff --git a/pylint/checkers/bad_chained_comparison.py b/pylint/checkers/bad_chained_comparison.py
index 2e19121604..ec3abea515 100644
--- a/pylint/checkers/bad_chained_comparison.py
+++ b/pylint/checkers/bad_chained_comparison.py
@@ -6,12 +6,12 @@
 
 from typing import TYPE_CHECKING
 
-from astroid import nodes
-
 from pylint.checkers import BaseChecker
 from pylint.interfaces import HIGH
 
 if TYPE_CHECKING:
+    from astroid import nodes
+
     from pylint.lint import PyLinter
 
 COMPARISON_OP = frozenset(("<", "<=", ">", ">=", "!=", "=="))
diff --git a/pylint/checkers/base/basic_checker.py b/pylint/checkers/base/basic_checker.py
index bd31905282..40148d424e 100644
--- a/pylint/checkers/base/basic_checker.py
+++ b/pylint/checkers/base/basic_checker.py
@@ -8,7 +8,6 @@
 
 import collections
 import itertools
-from collections.abc import Iterator
 from typing import TYPE_CHECKING, Literal, cast
 
 import astroid
@@ -16,12 +15,15 @@
 
 from pylint import utils as lint_utils
 from pylint.checkers import BaseChecker, utils
-from pylint.interfaces import HIGH, INFERENCE, Confidence
+from pylint.interfaces import HIGH, INFERENCE
 from pylint.reporters.ureports import nodes as reporter_nodes
-from pylint.utils import LinterStats
 
 if TYPE_CHECKING:
+    from collections.abc import Iterator
+
+    from pylint.interfaces import Confidence
     from pylint.lint.pylinter import PyLinter
+    from pylint.utils import LinterStats
 
 
 class _BasicChecker(BaseChecker):
diff --git a/pylint/checkers/base/basic_error_checker.py b/pylint/checkers/base/basic_error_checker.py
index d6e10f31d0..ca3b064efd 100644
--- a/pylint/checkers/base/basic_error_checker.py
+++ b/pylint/checkers/base/basic_error_checker.py
@@ -7,16 +7,20 @@
 from __future__ import annotations
 
 import itertools
+from typing import TYPE_CHECKING
 
 import astroid
 from astroid import nodes
-from astroid.typing import InferenceResult
 
 from pylint.checkers import utils
 from pylint.checkers.base.basic_checker import _BasicChecker
 from pylint.checkers.utils import infer_all
 from pylint.interfaces import HIGH
 
+if TYPE_CHECKING:
+    from astroid.typing import InferenceResult
+
+
 ABC_METACLASSES = {"_py_abc.ABCMeta", "abc.ABCMeta"}  # Python 3.7+,
 # List of methods which can be redefined
 REDEFINABLE_METHODS = frozenset(("__module__",))
diff --git a/pylint/checkers/base/docstring_checker.py b/pylint/checkers/base/docstring_checker.py
index aecfd9b060..4e90e8c896 100644
--- a/pylint/checkers/base/docstring_checker.py
+++ b/pylint/checkers/base/docstring_checker.py
@@ -7,7 +7,8 @@
 from __future__ import annotations
 
 import re
-from typing import Literal
+from typing import TYPE_CHECKING
+
 
 import astroid
 from astroid import nodes
@@ -21,6 +22,10 @@
     is_property_setter,
 )
 
+if TYPE_CHECKING:
+    from typing import Literal
+
+
 # do not require a doc string on private/system methods
 NO_REQUIRED_DOC_RGX = re.compile("^_")
 
diff --git a/pylint/checkers/base/name_checker/checker.py b/pylint/checkers/base/name_checker/checker.py
index 1d8589a576..1c26fe12c8 100644
--- a/pylint/checkers/base/name_checker/checker.py
+++ b/pylint/checkers/base/name_checker/checker.py
@@ -6,14 +6,11 @@
 
 from __future__ import annotations
 
-import argparse
 import collections
 import itertools
 import re
 import sys
-from collections.abc import Iterable
 from enum import Enum, auto
-from re import Pattern
 from typing import TYPE_CHECKING
 
 import astroid
@@ -29,10 +26,14 @@
     _create_naming_options,
 )
 from pylint.checkers.utils import is_property_deleter, is_property_setter
-from pylint.typing import Options
 
 if TYPE_CHECKING:
+    import argparse
+    from collections.abc import Iterable
+    from re import Pattern
+
     from pylint.lint.pylinter import PyLinter
+    from pylint.typing import Options
 
 _BadNamesTuple = tuple[nodes.NodeNG, str, str, interfaces.Confidence]
 
diff --git a/pylint/checkers/base/name_checker/naming_style.py b/pylint/checkers/base/name_checker/naming_style.py
index 0198ae7d1e..9df22dfceb 100644
--- a/pylint/checkers/base/name_checker/naming_style.py
+++ b/pylint/checkers/base/name_checker/naming_style.py
@@ -5,10 +5,14 @@
 from __future__ import annotations
 
 import re
-from re import Pattern
+from typing import TYPE_CHECKING
 
 from pylint import constants
-from pylint.typing import OptionDict, Options
+
+if TYPE_CHECKING:
+    from re import Pattern
+
+    from pylint.typing import OptionDict, Options
 
 
 class NamingStyle:
diff --git a/pylint/checkers/base_checker.py b/pylint/checkers/base_checker.py
index 6d577e0bdd..3d239aebc5 100644
--- a/pylint/checkers/base_checker.py
+++ b/pylint/checkers/base_checker.py
@@ -6,29 +6,31 @@
 
 import abc
 import functools
-from collections.abc import Iterable, Sequence
 from inspect import cleandoc
-from tokenize import TokenInfo
-from typing import TYPE_CHECKING, Any
-
-from astroid import nodes
+from typing import TYPE_CHECKING
 
 from pylint.config.arguments_provider import _ArgumentsProvider
 from pylint.constants import _MSG_ORDER, MAIN_CHECKER_NAME, WarningScope
 from pylint.exceptions import InvalidMessageError
-from pylint.interfaces import Confidence
 from pylint.message.message_definition import MessageDefinition
-from pylint.typing import (
-    ExtraMessageOptions,
-    MessageDefinitionTuple,
-    OptionDict,
-    Options,
-    ReportsCallable,
-)
+from pylint.typing import ExtraMessageOptions
 from pylint.utils import get_rst_section, get_rst_title
 
 if TYPE_CHECKING:
+    from collections.abc import Iterable, Sequence
+    from tokenize import TokenInfo
+    from typing import Any
+
+    from astroid import nodes
+
     from pylint.lint import PyLinter
+    from pylint.interfaces import Confidence
+    from pylint.typing import (
+        MessageDefinitionTuple,
+        OptionDict,
+        Options,
+        ReportsCallable,
+    )
 
 
 @functools.total_ordering
diff --git a/pylint/checkers/classes/class_checker.py b/pylint/checkers/classes/class_checker.py
index 0caeeadcdf..e38dd99407 100644
--- a/pylint/checkers/classes/class_checker.py
+++ b/pylint/checkers/classes/class_checker.py
@@ -7,16 +7,12 @@
 from __future__ import annotations
 
 from collections import defaultdict
-from collections.abc import Callable, Sequence
 from functools import cached_property
 from itertools import chain, zip_longest
-from re import Pattern
-from typing import TYPE_CHECKING, Any, NamedTuple, Union
+from typing import TYPE_CHECKING, NamedTuple
 
 import astroid
-from astroid import bases, nodes, util
-from astroid.nodes import LocalsDictNodeNG
-from astroid.typing import SuccessfulInferenceResult
+from astroid import nodes, util
 
 from pylint.checkers import BaseChecker, utils
 from pylint.checkers.utils import (
@@ -40,13 +36,21 @@
     uninferable_final_decorators,
 )
 from pylint.interfaces import HIGH, INFERENCE
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
+    from collections.abc import Callable, Sequence
+    from re import Pattern
+    from typing import Any, Union
+
+    from astroid import bases
+    from astroid.nodes import LocalsDictNodeNG
+    from astroid.typing import SuccessfulInferenceResult
+
     from pylint.lint.pylinter import PyLinter
+    from pylint.typing import MessageDefinitionTuple
 
+    _AccessNodes = Union[nodes.Attribute, nodes.AssignAttr]
 
-_AccessNodes = Union[nodes.Attribute, nodes.AssignAttr]
 
 INVALID_BASE_CLASSES = {"bool", "range", "slice", "memoryview"}
 ALLOWED_PROPERTIES = {"bultins.property", "functools.cached_property"}
diff --git a/pylint/checkers/classes/special_methods_checker.py b/pylint/checkers/classes/special_methods_checker.py
index 025f285622..ea438acabb 100644
--- a/pylint/checkers/classes/special_methods_checker.py
+++ b/pylint/checkers/classes/special_methods_checker.py
@@ -6,12 +6,10 @@
 
 from __future__ import annotations
 
-from collections.abc import Callable
+from typing import TYPE_CHECKING
 
 import astroid
 from astroid import bases, nodes, util
-from astroid.context import InferenceContext
-from astroid.typing import InferenceResult
 
 from pylint.checkers import BaseChecker
 from pylint.checkers.utils import (
@@ -22,7 +20,15 @@
     only_required_for_messages,
     safe_infer,
 )
-from pylint.lint.pylinter import PyLinter
+
+if TYPE_CHECKING:
+    from collections.abc import Callable
+
+    from astroid.context import InferenceContext
+    from astroid.typing import InferenceResult
+
+    from pylint.lint.pylinter import PyLinter
+
 
 NEXT_METHOD = "__next__"
 
diff --git a/pylint/checkers/deprecated.py b/pylint/checkers/deprecated.py
index 028dc13f38..4855672bd3 100644
--- a/pylint/checkers/deprecated.py
+++ b/pylint/checkers/deprecated.py
@@ -6,8 +6,8 @@
 
 from __future__ import annotations
 
-from collections.abc import Container, Iterable
 from itertools import chain
+from typing import TYPE_CHECKING
 
 import astroid
 from astroid import nodes
@@ -17,7 +17,12 @@
 from pylint.checkers.base_checker import BaseChecker
 from pylint.checkers.utils import get_import_name, infer_all, safe_infer
 from pylint.interfaces import INFERENCE
-from pylint.typing import MessageDefinitionTuple
+
+if TYPE_CHECKING:
+    from collections.abc import Container, Iterable
+
+    from pylint.typing import MessageDefinitionTuple
+
 
 ACCEPTABLE_NODES = (
     astroid.BoundMethod,
diff --git a/pylint/checkers/design_analysis.py b/pylint/checkers/design_analysis.py
index 5c1adbc888..a2f05ba470 100644
--- a/pylint/checkers/design_analysis.py
+++ b/pylint/checkers/design_analysis.py
@@ -8,19 +8,22 @@
 
 import re
 from collections import defaultdict
-from collections.abc import Iterator
 from typing import TYPE_CHECKING
 
 import astroid
-from astroid import nodes
 
 from pylint.checkers import BaseChecker
 from pylint.checkers.utils import is_enum, only_required_for_messages
 from pylint.interfaces import HIGH
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
+    from collections.abc import Iterator
+
+    from astroid import nodes
+
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
+
 
 MSGS: dict[str, MessageDefinitionTuple] = (
     {  # pylint: disable=consider-using-namedtuple-or-dataclass
diff --git a/pylint/checkers/exceptions.py b/pylint/checkers/exceptions.py
index 3834f260be..0d1bd58f40 100644
--- a/pylint/checkers/exceptions.py
+++ b/pylint/checkers/exceptions.py
@@ -8,21 +8,25 @@
 
 import builtins
 import inspect
-from collections.abc import Generator
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING
 
 import astroid
-from astroid import nodes, objects, util
-from astroid.context import InferenceContext
-from astroid.typing import InferenceResult, SuccessfulInferenceResult
+from astroid import nodes, util
 
 from pylint import checkers
 from pylint.checkers import utils
 from pylint.interfaces import HIGH, INFERENCE
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
+    from collections.abc import Generator
+    from typing import Any
+
+    from astroid import objects
+    from astroid.context import InferenceContext
+    from astroid.typing import InferenceResult, SuccessfulInferenceResult
+
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
 
 
 def _builtin_exceptions() -> set[str]:
diff --git a/pylint/checkers/format.py b/pylint/checkers/format.py
index 12fa930162..57e4214845 100644
--- a/pylint/checkers/format.py
+++ b/pylint/checkers/format.py
@@ -15,8 +15,7 @@
 
 import tokenize
 from functools import reduce
-from re import Match
-from typing import TYPE_CHECKING, Literal
+from typing import TYPE_CHECKING
 
 from astroid import nodes
 
@@ -24,11 +23,14 @@
 from pylint.checkers.utils import only_required_for_messages
 from pylint.constants import WarningScope
 from pylint.interfaces import HIGH
-from pylint.typing import MessageDefinitionTuple
 from pylint.utils.pragma_parser import OPTION_PO, PragmaParserError, parse_pragma
 
 if TYPE_CHECKING:
+    from re import Match
+    from typing import Literal
+
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
 
 
 _KEYWORD_TOKENS = {
diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py
index 2fa212cd7a..f5f7b4a70d 100644
--- a/pylint/checkers/imports.py
+++ b/pylint/checkers/imports.py
@@ -11,13 +11,11 @@
 import os
 import sys
 from collections import defaultdict
-from collections.abc import ItemsView, Sequence
 from functools import cached_property
 from typing import TYPE_CHECKING, Any, Union
 
 import astroid
 from astroid import nodes
-from astroid.nodes._base_nodes import ImportNode
 
 from pylint.checkers import BaseChecker, DeprecatedMixin
 from pylint.checkers.utils import (
@@ -32,13 +30,18 @@
 from pylint.exceptions import EmptyReportError
 from pylint.graph import DotBackend, get_cycles
 from pylint.interfaces import HIGH
-from pylint.reporters.ureports.nodes import Paragraph, Section, VerbatimText
-from pylint.typing import MessageDefinitionTuple
+from pylint.reporters.ureports.nodes import Paragraph, VerbatimText
 from pylint.utils import IsortDriver
-from pylint.utils.linterstats import LinterStats
 
 if TYPE_CHECKING:
+    from collections.abc import ItemsView, Sequence
+
+    from astroid.nodes._base_nodes import ImportNode
+
     from pylint.lint import PyLinter
+    from pylint.reporters.ureports.nodes import Section
+    from pylint.typing import MessageDefinitionTuple
+    from pylint.utils.linterstats import LinterStats
 
 
 # The dictionary with Any should actually be a _ImportTree again
diff --git a/pylint/checkers/logging.py b/pylint/checkers/logging.py
index d057c78ecb..de93cac0cd 100644
--- a/pylint/checkers/logging.py
+++ b/pylint/checkers/logging.py
@@ -7,20 +7,25 @@
 from __future__ import annotations
 
 import string
-from typing import TYPE_CHECKING, Literal
+from typing import TYPE_CHECKING
 
 import astroid
-from astroid import bases, nodes
-from astroid.typing import InferenceResult
+from astroid import nodes
 
 from pylint import checkers
 from pylint.checkers import utils
 from pylint.checkers.utils import infer_all
 from pylint.interfaces import HIGH
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
+    from typing import Literal
+
+    from astroid import bases
+    from astroid.typing import InferenceResult
+
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
+
 
 MSGS: dict[str, MessageDefinitionTuple] = (
     {  # pylint: disable=consider-using-namedtuple-or-dataclass
diff --git a/pylint/checkers/misc.py b/pylint/checkers/misc.py
index 78c21d0c5e..1567e7b35b 100644
--- a/pylint/checkers/misc.py
+++ b/pylint/checkers/misc.py
@@ -10,13 +10,13 @@
 import tokenize
 from typing import TYPE_CHECKING
 
-from astroid import nodes
-
 from pylint.checkers import BaseRawFileChecker, BaseTokenChecker
-from pylint.typing import ManagedMessage
 
 if TYPE_CHECKING:
+    from astroid import nodes
+
     from pylint.lint import PyLinter
+    from pylint.typing import ManagedMessage
 
 
 class ByIdManagedMessagesChecker(BaseRawFileChecker):
diff --git a/pylint/checkers/newstyle.py b/pylint/checkers/newstyle.py
index 920c8cc41e..8d9300968b 100644
--- a/pylint/checkers/newstyle.py
+++ b/pylint/checkers/newstyle.py
@@ -13,10 +13,11 @@
 
 from pylint.checkers import BaseChecker
 from pylint.checkers.utils import node_frame_class, only_required_for_messages
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
+
 
 MSGS: dict[str, MessageDefinitionTuple] = {
     "E1003": (
diff --git a/pylint/checkers/non_ascii_names.py b/pylint/checkers/non_ascii_names.py
index 693d8529f5..1e03238b3e 100644
--- a/pylint/checkers/non_ascii_names.py
+++ b/pylint/checkers/non_ascii_names.py
@@ -12,11 +12,16 @@
 
 from __future__ import annotations
 
+from typing import TYPE_CHECKING
+
 from astroid import nodes
 
-from pylint import constants, interfaces, lint
+from pylint import constants, interfaces
 from pylint.checkers import base_checker, utils
 
+if TYPE_CHECKING:
+    from pylint import lint
+
 NON_ASCII_HELP = (
     "Used when the name contains at least one non-ASCII unicode character. "
     "See https://peps.python.org/pep-0672/#confusing-features"
diff --git a/pylint/checkers/raw_metrics.py b/pylint/checkers/raw_metrics.py
index ef4535345a..a4e2cab39b 100644
--- a/pylint/checkers/raw_metrics.py
+++ b/pylint/checkers/raw_metrics.py
@@ -5,14 +5,18 @@
 from __future__ import annotations
 
 import tokenize
-from typing import TYPE_CHECKING, Any, Literal, cast
+from typing import TYPE_CHECKING, Literal, cast
 
 from pylint.checkers import BaseTokenChecker
-from pylint.reporters.ureports.nodes import Paragraph, Section, Table, Text
-from pylint.utils import LinterStats, diff_string
+from pylint.reporters.ureports.nodes import Paragraph, Table, Text
+from pylint.utils import diff_string
 
 if TYPE_CHECKING:
+    from typing import Any
+
     from pylint.lint import PyLinter
+    from pylint.reporters.ureports.nodes import Section
+    from pylint.utils import LinterStats
 
 
 def report_raw_stats(
diff --git a/pylint/checkers/refactoring/implicit_booleaness_checker.py b/pylint/checkers/refactoring/implicit_booleaness_checker.py
index 4d3d47cf9f..b6016cbc04 100644
--- a/pylint/checkers/refactoring/implicit_booleaness_checker.py
+++ b/pylint/checkers/refactoring/implicit_booleaness_checker.py
@@ -5,14 +5,18 @@
 from __future__ import annotations
 
 import itertools
+from typing import TYPE_CHECKING
 
 import astroid
-from astroid import bases, nodes, util
+from astroid import bases, nodes
 
 from pylint import checkers
 from pylint.checkers import utils
 from pylint.interfaces import HIGH, INFERENCE
 
+if TYPE_CHECKING:
+    from astroid import util
+
 
 def _is_constant_zero(node: str | nodes.NodeNG) -> bool:
     # We have to check that node.value is not False because node.value == 0 is True
diff --git a/pylint/checkers/refactoring/refactoring_checker.py b/pylint/checkers/refactoring/refactoring_checker.py
index c67c8dd232..b19e363b88 100644
--- a/pylint/checkers/refactoring/refactoring_checker.py
+++ b/pylint/checkers/refactoring/refactoring_checker.py
@@ -8,10 +8,8 @@
 import copy
 import itertools
 import tokenize
-from collections.abc import Iterator
 from functools import cached_property, reduce
-from re import Pattern
-from typing import TYPE_CHECKING, Any, NamedTuple, Union, cast
+from typing import TYPE_CHECKING, NamedTuple, Union, cast
 
 import astroid
 from astroid import bases, nodes
@@ -21,9 +19,14 @@
 from pylint.checkers import utils
 from pylint.checkers.base.basic_error_checker import _loop_exits_early
 from pylint.checkers.utils import node_frame_class
-from pylint.interfaces import HIGH, INFERENCE, Confidence
+from pylint.interfaces import HIGH, INFERENCE
 
 if TYPE_CHECKING:
+    from collections.abc import Iterator
+    from re import Pattern
+    from typing import Any
+
+    from pylint.interfaces import Confidence
     from pylint.lint import PyLinter
 
 
diff --git a/pylint/checkers/spelling.py b/pylint/checkers/spelling.py
index 27d1c7ce0b..07b5438843 100644
--- a/pylint/checkers/spelling.py
+++ b/pylint/checkers/spelling.py
@@ -8,15 +8,17 @@
 
 import re
 import tokenize
-from re import Pattern
-from typing import TYPE_CHECKING, Any, Literal
-
-from astroid import nodes
+from typing import TYPE_CHECKING
 
 from pylint.checkers import BaseTokenChecker
 from pylint.checkers.utils import only_required_for_messages
 
 if TYPE_CHECKING:
+    from re import Pattern
+    from typing import Any, Literal
+
+    from astroid import nodes
+
     from pylint.lint import PyLinter
 
 try:
diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py
index 9225cd4d26..91ea6840f2 100644
--- a/pylint/checkers/stdlib.py
+++ b/pylint/checkers/stdlib.py
@@ -7,22 +7,26 @@
 from __future__ import annotations
 
 import sys
-from collections.abc import Iterable
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING
 
 import astroid
 from astroid import nodes, util
-from astroid.typing import InferenceResult
 
 from pylint import interfaces
 from pylint.checkers import BaseChecker, DeprecatedMixin, utils
 from pylint.interfaces import HIGH, INFERENCE
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
+    from collections.abc import Iterable
+    from typing import Any
+
+    from astroid.typing import InferenceResult
+
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
+
+    DeprecationDict = dict[tuple[int, int, int], set[str]]
 
-DeprecationDict = dict[tuple[int, int, int], set[str]]
 
 OPEN_FILES_MODE = ("open", "file")
 OPEN_FILES_FUNCS = (*OPEN_FILES_MODE, "read_text", "write_text")
diff --git a/pylint/checkers/strings.py b/pylint/checkers/strings.py
index 90493fa006..84f0de0663 100644
--- a/pylint/checkers/strings.py
+++ b/pylint/checkers/strings.py
@@ -6,25 +6,28 @@
 
 from __future__ import annotations
 
-import collections
 import re
 import sys
 import tokenize
 from collections import Counter
-from collections.abc import Iterable, Sequence
-from typing import TYPE_CHECKING, Literal
+from typing import TYPE_CHECKING
 
 import astroid
-from astroid import bases, nodes, util
-from astroid.typing import SuccessfulInferenceResult
+from astroid import nodes, util
 
 from pylint.checkers import BaseChecker, BaseRawFileChecker, BaseTokenChecker, utils
 from pylint.checkers.utils import only_required_for_messages
 from pylint.interfaces import HIGH
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
+    from collections.abc import Iterable, Sequence
+    from typing import Literal
+
+    from astroid import bases
+    from astroid.typing import SuccessfulInferenceResult
+
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
 
 
 _AST_NODE_STR_TYPES = ("__builtin__.unicode", "__builtin__.str", "builtins.str")
@@ -439,7 +442,7 @@ def visit_call(self, node: nodes.Call) -> None:
     def _detect_vacuous_formatting(
         self, node: nodes.Call, positional_arguments: list[SuccessfulInferenceResult]
     ) -> None:
-        counter = collections.Counter(
+        counter = Counter(
             arg.name for arg in positional_arguments if isinstance(arg, nodes.Name)
         )
         for name, count in counter.items():
@@ -833,7 +836,7 @@ def check_for_consistent_string_delimiters(
         Args:
           tokens: The tokens to be checked against for consistent usage.
         """
-        string_delimiters: Counter[str] = collections.Counter()
+        string_delimiters: Counter[str] = Counter()
 
         inside_fstring = False  # whether token is inside f-string (since 3.12)
         target_py312 = self.linter.config.py_version >= (3, 12)
diff --git a/pylint/checkers/symilar.py b/pylint/checkers/symilar.py
index 1e82633e65..afec4d135d 100644
--- a/pylint/checkers/symilar.py
+++ b/pylint/checkers/symilar.py
@@ -38,21 +38,26 @@
 import sys
 import warnings
 from collections import defaultdict
-from collections.abc import Callable, Generator, Iterable, Sequence
 from io import BufferedIOBase, BufferedReader, BytesIO
 from itertools import chain
-from typing import TYPE_CHECKING, NamedTuple, NewType, NoReturn, TextIO, Union
+from typing import TYPE_CHECKING, NamedTuple, NewType, TextIO, Union
 
 import astroid
 from astroid import nodes
 
 from pylint.checkers import BaseChecker, BaseRawFileChecker, table_lines_from_stats
-from pylint.reporters.ureports.nodes import Section, Table
-from pylint.typing import MessageDefinitionTuple, Options
-from pylint.utils import LinterStats, decoding_stream
+from pylint.reporters.ureports.nodes import Table
+from pylint.utils import decoding_stream
 
 if TYPE_CHECKING:
+    from collections.abc import Callable, Generator, Iterable, Sequence
+    from typing import NoReturn
+
     from pylint.lint import PyLinter
+    from pylint.reporters.ureports.nodes import Section
+    from pylint.typing import MessageDefinitionTuple, Options
+    from pylint.utils import LinterStats
+
 
 DEFAULT_MIN_SIMILARITY_LINE = 4
 
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py
index bc7ddfc2a4..cb40a69d32 100644
--- a/pylint/checkers/typecheck.py
+++ b/pylint/checkers/typecheck.py
@@ -12,17 +12,13 @@
 import re
 import shlex
 import sys
-from collections.abc import Callable, Iterable
 from functools import cached_property, singledispatch
-from re import Pattern
-from typing import TYPE_CHECKING, Any, Literal, Union
+from typing import TYPE_CHECKING
 
 import astroid
 import astroid.exceptions
 import astroid.helpers
-from astroid import arguments, bases, nodes, util
-from astroid.nodes import _base_nodes
-from astroid.typing import InferenceResult, SuccessfulInferenceResult
+from astroid import bases, nodes, util
 
 from pylint.checkers import BaseChecker, utils
 from pylint.checkers.utils import (
@@ -51,18 +47,27 @@
 )
 from pylint.constants import PY310_PLUS
 from pylint.interfaces import HIGH, INFERENCE
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
+    from collections.abc import Callable, Iterable
+    from re import Pattern
+    from typing import Any, Literal, Union
+
+    from astroid import arguments
+    from astroid.nodes import _base_nodes
+    from astroid.typing import InferenceResult, SuccessfulInferenceResult
+
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
+
+    CallableObjects = Union[
+        bases.BoundMethod,
+        bases.UnboundMethod,
+        nodes.FunctionDef,
+        nodes.Lambda,
+        nodes.ClassDef,
+    ]
 
-CallableObjects = Union[
-    bases.BoundMethod,
-    bases.UnboundMethod,
-    nodes.FunctionDef,
-    nodes.Lambda,
-    nodes.ClassDef,
-]
 
 STR_FORMAT = {"builtins.str.format"}
 ASYNCIO_COROUTINE = "asyncio.coroutines.coroutine"
diff --git a/pylint/checkers/unicode.py b/pylint/checkers/unicode.py
index c90ace9710..5ea226d0ec 100644
--- a/pylint/checkers/unicode.py
+++ b/pylint/checkers/unicode.py
@@ -15,21 +15,25 @@
 
 import codecs
 import contextlib
-import io
 import re
 from collections import OrderedDict
-from collections.abc import Iterable
 from functools import lru_cache
 from tokenize import detect_encoding
-from typing import NamedTuple, TypeVar
-
-from astroid import nodes
+from typing import TYPE_CHECKING
+from typing import NamedTuple
 
 import pylint.interfaces
 import pylint.lint
 from pylint import checkers
 
-_StrLike = TypeVar("_StrLike", str, bytes)
+if TYPE_CHECKING:
+    from collections.abc import Iterable
+    import io
+    from typing import TypeVar
+
+    from astroid import nodes
+
+    _StrLike = TypeVar("_StrLike", str, bytes)
 
 # Based on:
 # https://golangexample.com/go-linter-which-checks-for-dangerous-unicode-character-sequences/
diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py
index bfc4bc61da..58b64b9d0d 100644
--- a/pylint/checkers/utils.py
+++ b/pylint/checkers/utils.py
@@ -13,28 +13,31 @@
 import numbers
 import re
 import string
-from collections.abc import Callable, Iterable, Iterator
 from functools import lru_cache, partial
-from re import Match
-from typing import TYPE_CHECKING, Any, TypeVar
+from typing import TYPE_CHECKING
 
 import astroid.objects
 from astroid import TooManyLevelsError, nodes, util
-from astroid.context import InferenceContext
 from astroid.exceptions import AstroidError
-from astroid.nodes._base_nodes import ImportNode, Statement
-from astroid.typing import InferenceResult, SuccessfulInferenceResult
 
 from pylint.constants import TYPING_NEVER, TYPING_NORETURN
 
 if TYPE_CHECKING:
+    from collections.abc import Callable, Iterable, Iterator
     from functools import _lru_cache_wrapper
+    from re import Match
+    from typing import Any, TypeVar
+
+    from astroid.context import InferenceContext
+    from astroid.nodes._base_nodes import ImportNode, Statement
+    from astroid.typing import InferenceResult, SuccessfulInferenceResult
 
     from pylint.checkers import BaseChecker
 
-_NodeT = TypeVar("_NodeT", bound=nodes.NodeNG)
-_CheckerT = TypeVar("_CheckerT", bound="BaseChecker")
-AstCallbackMethod = Callable[[_CheckerT, _NodeT], None]
+    _NodeT = TypeVar("_NodeT", bound=nodes.NodeNG)
+    _CheckerT = TypeVar("_CheckerT", bound="BaseChecker")
+    AstCallbackMethod = Callable[[_CheckerT, _NodeT], None]
+
 
 COMP_NODE_TYPES = (
     nodes.ListComp,
diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py
index 47f6b92d6e..7113bee9a2 100644
--- a/pylint/checkers/variables.py
+++ b/pylint/checkers/variables.py
@@ -6,23 +6,19 @@
 
 from __future__ import annotations
 
-import collections
 import copy
 import itertools
 import math
 import os
 import re
 from collections import defaultdict
-from collections.abc import Generator, Iterable, Iterator
 from enum import Enum
 from functools import cached_property
-from typing import TYPE_CHECKING, Any, NamedTuple
+from typing import TYPE_CHECKING, NamedTuple
 
 import astroid
 import astroid.exceptions
 from astroid import bases, extract_node, nodes, util
-from astroid.nodes import _base_nodes
-from astroid.typing import InferenceResult
 
 from pylint.checkers import BaseChecker, utils
 from pylint.checkers.utils import (
@@ -34,10 +30,17 @@
 )
 from pylint.constants import TYPING_NEVER, TYPING_NORETURN
 from pylint.interfaces import CONTROL_FLOW, HIGH, INFERENCE, INFERENCE_FAILURE
-from pylint.typing import MessageDefinitionTuple
 
 if TYPE_CHECKING:
+    from collections.abc import Generator, Iterable, Iterator
+    from typing import Any
+
+    from astroid.nodes import _base_nodes
+    from astroid.typing import InferenceResult
+
     from pylint.lint import PyLinter
+    from pylint.typing import MessageDefinitionTuple
+
 
 SPECIAL_OBJ = re.compile("^_{2}[a-z]+_{2}$")
 FUTURE = "__future__"
@@ -538,7 +541,7 @@ class NamesConsumer:
 
     def __init__(self, node: nodes.NodeNG, scope_type: str) -> None:
         self._atomic = ScopeConsumer(
-            copy.copy(node.locals), {}, collections.defaultdict(list), scope_type
+            copy.copy(node.locals), {}, defaultdict(list), scope_type
         )
         self.node = node
         self.names_under_always_false_test: set[str] = set()
@@ -3200,7 +3203,7 @@ def _check_imports(self, not_consumed: dict[str, list[nodes.NodeNG]]) -> None:
         checked = set()
         unused_wildcard_imports: defaultdict[
             tuple[str, nodes.ImportFrom], list[str]
-        ] = collections.defaultdict(list)
+        ] = defaultdict(list)
         for name, stmt in local_names:
             for imports in stmt.names:
                 real_name = imported_name = imports[0]
diff --git a/pylint/config/_pylint_config/setup.py b/pylint/config/_pylint_config/setup.py
index 211f9bc6d3..eae1058b8c 100644
--- a/pylint/config/_pylint_config/setup.py
+++ b/pylint/config/_pylint_config/setup.py
@@ -8,12 +8,15 @@
 from __future__ import annotations
 
 import argparse
-from collections.abc import Sequence
-from typing import Any
+from typing import TYPE_CHECKING
 
 from pylint.config._pylint_config.help_message import get_help
 from pylint.config.callback_actions import _AccessParserAction
 
+if TYPE_CHECKING:
+    from collections.abc import Sequence
+    from typing import Any
+
 
 class _HelpAction(_AccessParserAction):
     def __call__(
diff --git a/pylint/config/_pylint_config/utils.py b/pylint/config/_pylint_config/utils.py
index f9185e8b1d..8875f1e1b4 100644
--- a/pylint/config/_pylint_config/utils.py
+++ b/pylint/config/_pylint_config/utils.py
@@ -7,17 +7,21 @@
 from __future__ import annotations
 
 import sys
-from collections.abc import Callable
 from pathlib import Path
-from typing import Literal, TypeVar
+from typing import TYPE_CHECKING
 
-if sys.version_info >= (3, 10):
-    from typing import ParamSpec
-else:
-    from typing_extensions import ParamSpec
+if TYPE_CHECKING:
+    from collections.abc import Callable
+    from typing import Literal, TypeVar
+
+    if sys.version_info >= (3, 10):
+        from typing import ParamSpec
+    else:
+        from typing_extensions import ParamSpec
+
+    _P = ParamSpec("_P")
+    _ReturnValueT = TypeVar("_ReturnValueT", bool, str)
 
-_P = ParamSpec("_P")
-_ReturnValueT = TypeVar("_ReturnValueT", bool, str)
 
 SUPPORTED_FORMATS = {"t", "toml", "i", "ini"}
 YES_NO_ANSWERS = {"y", "yes", "n", "no"}
diff --git a/pylint/config/argument.py b/pylint/config/argument.py
index a515a942b4..9549f56e94 100644
--- a/pylint/config/argument.py
+++ b/pylint/config/argument.py
@@ -13,27 +13,31 @@
 import os
 import pathlib
 import re
-from collections.abc import Callable, Sequence
 from glob import glob
 from re import Pattern
-from typing import Any, Literal, Union
+from typing import TYPE_CHECKING
 
 from pylint import interfaces
 from pylint import utils as pylint_utils
-from pylint.config.callback_actions import _CallbackAction
 from pylint.config.deprecation_actions import _NewNamesAction, _OldNamesAction
 
-_ArgumentTypes = Union[
-    str,
-    int,
-    float,
-    bool,
-    Pattern[str],
-    Sequence[str],
-    Sequence[Pattern[str]],
-    tuple[int, ...],
-]
-"""List of possible argument types."""
+if TYPE_CHECKING:
+    from collections.abc import Callable, Sequence
+    from typing import Any, Literal, Union
+
+    from pylint.config.callback_actions import _CallbackAction
+
+    _ArgumentTypes = Union[
+        str,
+        int,
+        float,
+        bool,
+        Pattern[str],
+        Sequence[str],
+        Sequence[Pattern[str]],
+        tuple[int, ...],
+    ]
+    """List of possible argument types."""
 
 
 def _confidence_transformer(value: str) -> Sequence[str]:
diff --git a/pylint/config/arguments_manager.py b/pylint/config/arguments_manager.py
index aca8f5f878..c85b5e4ca4 100644
--- a/pylint/config/arguments_manager.py
+++ b/pylint/config/arguments_manager.py
@@ -11,14 +11,12 @@
 import sys
 import textwrap
 import warnings
-from collections.abc import Sequence
-from typing import TYPE_CHECKING, Any, TextIO
+from typing import TYPE_CHECKING
 
 import tomlkit
 
 from pylint import utils
 from pylint.config.argument import (
-    _Argument,
     _CallableArgument,
     _ExtendArgument,
     _StoreArgument,
@@ -33,7 +31,6 @@
 from pylint.config.help_formatter import _HelpFormatter
 from pylint.config.utils import _convert_option_to_argument, _parse_rich_type_value
 from pylint.constants import MAIN_CHECKER_NAME
-from pylint.typing import DirectoryNamespaceDict, OptionDict
 
 if sys.version_info >= (3, 11):
     import tomllib
@@ -42,7 +39,12 @@
 
 
 if TYPE_CHECKING:
+    from collections.abc import Sequence
+    from typing import Any, TextIO
+
+    from pylint.typing import DirectoryNamespaceDict, OptionDict
     from pylint.config.arguments_provider import _ArgumentsProvider
+    from pylint.config.argument import _Argument
 
 
 class _ArgumentsManager:
diff --git a/pylint/config/arguments_provider.py b/pylint/config/arguments_provider.py
index 7f75718ca1..731cf1ff2d 100644
--- a/pylint/config/arguments_provider.py
+++ b/pylint/config/arguments_provider.py
@@ -6,11 +6,14 @@
 
 from __future__ import annotations
 
-from collections.abc import Iterator
-from typing import Any
+from typing import TYPE_CHECKING
 
-from pylint.config.arguments_manager import _ArgumentsManager
-from pylint.typing import OptionDict, Options
+if TYPE_CHECKING:
+    from typing import Any
+    from collections.abc import Iterator
+
+    from pylint.typing import OptionDict, Options
+    from pylint.config.arguments_manager import _ArgumentsManager
 
 
 class _ArgumentsProvider:
diff --git a/pylint/config/callback_actions.py b/pylint/config/callback_actions.py
index bf2decd3c6..dc2e8afd94 100644
--- a/pylint/config/callback_actions.py
+++ b/pylint/config/callback_actions.py
@@ -11,13 +11,15 @@
 import abc
 import argparse
 import sys
-from collections.abc import Callable, Sequence
 from pathlib import Path
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING
 
 from pylint import exceptions, extensions, interfaces, utils
 
 if TYPE_CHECKING:
+    from collections.abc import Callable, Sequence
+    from typing import Any
+
     from pylint.config.help_formatter import _HelpFormatter
     from pylint.lint import PyLinter
     from pylint.lint.run import Run
diff --git a/pylint/config/config_initialization.py b/pylint/config/config_initialization.py
index 9656ea5647..e80da1ea11 100644
--- a/pylint/config/config_initialization.py
+++ b/pylint/config/config_initialization.py
@@ -11,7 +11,6 @@
 from pathlib import Path
 from typing import TYPE_CHECKING
 
-from pylint import reporters
 from pylint.config.config_file_parser import _ConfigurationFileParser
 from pylint.config.exceptions import (
     ArgumentPreprocessingError,
@@ -21,6 +20,7 @@
 
 if TYPE_CHECKING:
     from pylint.lint import PyLinter
+    from pylint import reporters
 
 
 def _config_initialization(
diff --git a/pylint/config/deprecation_actions.py b/pylint/config/deprecation_actions.py
index 85a77cc78a..54757c45ae 100644
--- a/pylint/config/deprecation_actions.py
+++ b/pylint/config/deprecation_actions.py
@@ -10,8 +10,11 @@
 
 import argparse
 import warnings
-from collections.abc import Sequence
-from typing import Any
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from collections.abc import Sequence
+    from typing import Any
 
 
 class _OldNamesAction(argparse._StoreAction):
diff --git a/pylint/config/find_default_config_files.py b/pylint/config/find_default_config_files.py
index 7e53e77207..aa2d68f288 100644
--- a/pylint/config/find_default_config_files.py
+++ b/pylint/config/find_default_config_files.py
@@ -7,14 +7,17 @@
 import configparser
 import os
 import sys
-from collections.abc import Iterator
 from pathlib import Path
+from typing import TYPE_CHECKING
 
 if sys.version_info >= (3, 11):
     import tomllib
 else:
     import tomli as tomllib
 
+if TYPE_CHECKING:
+    from collections.abc import Iterator
+
 RC_NAMES = (
     Path("pylintrc"),
     Path("pylintrc.toml"),
diff --git a/pylint/config/utils.py b/pylint/config/utils.py
index 91e4ff86f6..91d9bba610 100644
--- a/pylint/config/utils.py
+++ b/pylint/config/utils.py
@@ -7,9 +7,8 @@
 from __future__ import annotations
 
 import re
-from collections.abc import Callable, Sequence
 from pathlib import Path
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING
 
 from pylint import extensions, utils
 from pylint.config.argument import (
@@ -24,6 +23,9 @@
 from pylint.config.exceptions import ArgumentPreprocessingError
 
 if TYPE_CHECKING:
+    from collections.abc import Callable, Sequence
+    from typing import Any
+
     from pylint.lint.run import Run
 
 
diff --git a/pylint/constants.py b/pylint/constants.py
index 0ba20162a1..a5bdb37c56 100644
--- a/pylint/constants.py
+++ b/pylint/constants.py
@@ -7,12 +7,16 @@
 import os
 import platform
 import sys
+from typing import TYPE_CHECKING
 
 import astroid
 import platformdirs
 
 from pylint.__pkginfo__ import __version__
-from pylint.typing import MessageTypesFullName
+
+if TYPE_CHECKING:
+    from pylint.typing import MessageTypesFullName
+
 
 PY310_PLUS = sys.version_info[:2] >= (3, 10)
 PY311_PLUS = sys.version_info[:2] >= (3, 11)
diff --git a/pylint/extensions/_check_docs_utils.py b/pylint/extensions/_check_docs_utils.py
index 9b4b3e0db6..5592010072 100644
--- a/pylint/extensions/_check_docs_utils.py
+++ b/pylint/extensions/_check_docs_utils.py
@@ -8,7 +8,7 @@
 
 import itertools
 import re
-from collections.abc import Iterable
+from typing import TYPE_CHECKING
 
 import astroid
 from astroid import nodes
@@ -16,6 +16,9 @@
 
 from pylint.checkers import utils
 
+if TYPE_CHECKING:
+    from collections.abc import Iterable
+
 
 def space_indentation(s: str) -> int:
     """The number of leading spaces in a string.
diff --git a/pylint/extensions/check_elif.py b/pylint/extensions/check_elif.py
index de20ed8ec6..3fe79bed38 100644
--- a/pylint/extensions/check_elif.py
+++ b/pylint/extensions/check_elif.py
@@ -4,8 +4,6 @@
 
 from __future__ import annotations
 
-import tokenize
-from tokenize import TokenInfo
 from typing import TYPE_CHECKING
 
 from astroid import nodes
@@ -15,6 +13,9 @@
 from pylint.interfaces import HIGH
 
 if TYPE_CHECKING:
+    import tokenize
+    from tokenize import TokenInfo
+
     from pylint.lint import PyLinter
 
 
diff --git a/pylint/extensions/code_style.py b/pylint/extensions/code_style.py
index 00d539500c..6817667261 100644
--- a/pylint/extensions/code_style.py
+++ b/pylint/extensions/code_style.py
@@ -4,7 +4,6 @@
 
 from __future__ import annotations
 
-import sys
 from typing import TYPE_CHECKING, cast
 
 from astroid import nodes
@@ -14,12 +13,14 @@
 from pylint.interfaces import INFERENCE
 
 if TYPE_CHECKING:
+    import sys
+
     from pylint.lint import PyLinter
 
-if sys.version_info >= (3, 10):
-    from typing import TypeGuard
-else:
-    from typing_extensions import TypeGuard
+    if sys.version_info >= (3, 10):
+        from typing import TypeGuard
+    else:
+        from typing_extensions import TypeGuard
 
 
 class CodeStyleChecker(BaseChecker):
diff --git a/pylint/extensions/docparams.py b/pylint/extensions/docparams.py
index b19560b7fb..2ce6694642 100644
--- a/pylint/extensions/docparams.py
+++ b/pylint/extensions/docparams.py
@@ -10,15 +10,16 @@
 from typing import TYPE_CHECKING
 
 import astroid
-from astroid import nodes
 
 from pylint.checkers import BaseChecker
 from pylint.checkers import utils as checker_utils
 from pylint.extensions import _check_docs_utils as utils
-from pylint.extensions._check_docs_utils import Docstring
 from pylint.interfaces import HIGH
 
 if TYPE_CHECKING:
+    from astroid import nodes
+
+    from pylint.extensions._check_docs_utils import Docstring
     from pylint.lint import PyLinter
 
 
diff --git a/pylint/extensions/docstyle.py b/pylint/extensions/docstyle.py
index c54ab93b20..4650398e85 100644
--- a/pylint/extensions/docstyle.py
+++ b/pylint/extensions/docstyle.py
@@ -7,13 +7,14 @@
 import linecache
 from typing import TYPE_CHECKING
 
-from astroid import nodes
 
 from pylint import checkers
 from pylint.checkers.utils import only_required_for_messages
 from pylint.interfaces import HIGH
 
 if TYPE_CHECKING:
+    from astroid import nodes
+
     from pylint.lint import PyLinter
 
 
diff --git a/pylint/extensions/dunder.py b/pylint/extensions/dunder.py
index 1683f81476..39ce32d403 100644
--- a/pylint/extensions/dunder.py
+++ b/pylint/extensions/dunder.py
@@ -6,13 +6,13 @@
 
 from typing import TYPE_CHECKING
 
-from astroid import nodes
-
 from pylint.checkers import BaseChecker
 from pylint.constants import DUNDER_METHODS, DUNDER_PROPERTIES, EXTRA_DUNDER_METHODS
 from pylint.interfaces import HIGH
 
 if TYPE_CHECKING:
+    from astroid import nodes
+
     from pylint.lint import PyLinter
 
 
diff --git a/pylint/extensions/empty_comment.py b/pylint/extensions/empty_comment.py
index 7f54322ae1..611aa2c2ac 100644
--- a/pylint/extensions/empty_comment.py
+++ b/pylint/extensions/empty_comment.py
@@ -6,11 +6,11 @@
 
 from typing import TYPE_CHECKING
 
-from astroid import nodes
-
 from pylint.checkers import BaseRawFileChecker
 
 if TYPE_CHECKING:
+    from astroid import nodes
+
     from pylint.lint import PyLinter
 
 
diff --git a/pylint/extensions/eq_without_hash.py b/pylint/extensions/eq_without_hash.py
index 5f39dfa3e2..4a1bf64ef3 100644
--- a/pylint/extensions/eq_without_hash.py
+++ b/pylint/extensions/eq_without_hash.py
@@ -9,11 +9,17 @@
 See https://github.com/pylint-dev/pylint/issues/5025
 """
 
-from astroid import nodes
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
 
 from pylint import checkers, interfaces
 from pylint.checkers import utils
-from pylint.lint import PyLinter
+
+if TYPE_CHECKING:
+    from astroid import nodes
+
+    from pylint.lint import PyLinter
 
 
 class EqWithoutHash(checkers.BaseChecker):
diff --git a/pylint/extensions/mccabe.py b/pylint/extensions/mccabe.py
index 9489f24d6c..03b1e1a8f5 100644
--- a/pylint/extensions/mccabe.py
+++ b/pylint/extensions/mccabe.py
@@ -6,8 +6,7 @@
 
 from __future__ import annotations
 
-from collections.abc import Sequence
-from typing import TYPE_CHECKING, Any, TypeVar, Union
+from typing import TYPE_CHECKING
 
 from astroid import nodes
 from mccabe import PathGraph as Mccabe_PathGraph
@@ -18,31 +17,34 @@
 from pylint.interfaces import HIGH
 
 if TYPE_CHECKING:
+    from collections.abc import Sequence
+    from typing import Any, TypeVar, Union
+
     from pylint.lint import PyLinter
 
-_StatementNodes = Union[
-    nodes.Assert,
-    nodes.Assign,
-    nodes.AugAssign,
-    nodes.Delete,
-    nodes.Raise,
-    nodes.Yield,
-    nodes.Import,
-    nodes.Call,
-    nodes.Subscript,
-    nodes.Pass,
-    nodes.Continue,
-    nodes.Break,
-    nodes.Global,
-    nodes.Return,
-    nodes.Expr,
-    nodes.Await,
-]
-
-_SubGraphNodes = Union[nodes.If, nodes.Try, nodes.For, nodes.While]
-_AppendableNodeT = TypeVar(
-    "_AppendableNodeT", bound=Union[_StatementNodes, nodes.While, nodes.FunctionDef]
-)
+    _StatementNodes = Union[
+        nodes.Assert,
+        nodes.Assign,
+        nodes.AugAssign,
+        nodes.Delete,
+        nodes.Raise,
+        nodes.Yield,
+        nodes.Import,
+        nodes.Call,
+        nodes.Subscript,
+        nodes.Pass,
+        nodes.Continue,
+        nodes.Break,
+        nodes.Global,
+        nodes.Return,
+        nodes.Expr,
+        nodes.Await,
+    ]
+
+    _SubGraphNodes = Union[nodes.If, nodes.Try, nodes.For, nodes.While]
+    _AppendableNodeT = TypeVar(
+        "_AppendableNodeT", bound=Union[_StatementNodes, nodes.While, nodes.FunctionDef]
+    )
 
 
 class PathGraph(Mccabe_PathGraph):  # type: ignore[misc]
diff --git a/pylint/extensions/overlapping_exceptions.py b/pylint/extensions/overlapping_exceptions.py
index 8d35e4ce32..fd1a312b4f 100644
--- a/pylint/extensions/overlapping_exceptions.py
+++ b/pylint/extensions/overlapping_exceptions.py
@@ -6,16 +6,20 @@
 
 from __future__ import annotations
 
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING
 
 import astroid
-from astroid import nodes, util
+from astroid import util
 
 from pylint import checkers
 from pylint.checkers import utils
 from pylint.checkers.exceptions import _annotated_unpack_infer
 
 if TYPE_CHECKING:
+    from typing import Any
+
+    from astroid import nodes
+
     from pylint.lint import PyLinter
 
 
diff --git a/pylint/extensions/redefined_loop_name.py b/pylint/extensions/redefined_loop_name.py
index d03b80be38..b7d5ea833d 100644
--- a/pylint/extensions/redefined_loop_name.py
+++ b/pylint/extensions/redefined_loop_name.py
@@ -6,12 +6,16 @@
 
 from __future__ import annotations
 
+from typing import TYPE_CHECKING
+
 from astroid import nodes
 
 from pylint import checkers
 from pylint.checkers import utils
 from pylint.interfaces import HIGH
-from pylint.lint import PyLinter
+
+if TYPE_CHECKING:
+    from pylint.lint import PyLinter
 
 
 class RedefinedLoopNameChecker(checkers.BaseChecker):
diff --git a/pylint/extensions/while_used.py b/pylint/extensions/while_used.py
index da1f9d59c2..ecfc9b67f5 100644
--- a/pylint/extensions/while_used.py
+++ b/pylint/extensions/while_used.py
@@ -8,12 +8,12 @@
 
 from typing import TYPE_CHECKING
 
-from astroid import nodes
-
 from pylint.checkers import BaseChecker
 from pylint.checkers.utils import only_required_for_messages
 
 if TYPE_CHECKING:
+    from astroid import nodes
+
     from pylint.lint import PyLinter
 
 
diff --git a/pylint/graph.py b/pylint/graph.py
index 4112fadfa1..445ab61209 100644
--- a/pylint/graph.py
+++ b/pylint/graph.py
@@ -14,8 +14,11 @@
 import shutil
 import subprocess
 import tempfile
-from collections.abc import Sequence
-from typing import Any
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from typing import Any
+    from collections.abc import Sequence
 
 
 def target_info_from_filename(filename: str) -> tuple[str, str, str]:
diff --git a/pylint/lint/base_options.py b/pylint/lint/base_options.py
index 59a811d9c6..1c91f3fc8e 100644
--- a/pylint/lint/base_options.py
+++ b/pylint/lint/base_options.py
@@ -28,9 +28,9 @@
     _MessageHelpAction,
     _OutputFormatAction,
 )
-from pylint.typing import Options
 
 if TYPE_CHECKING:
+    from pylint.typing import Options
     from pylint.lint import PyLinter, Run
 
 
diff --git a/pylint/lint/expand_modules.py b/pylint/lint/expand_modules.py
index f40bdeea5b..164d8395d5 100644
--- a/pylint/lint/expand_modules.py
+++ b/pylint/lint/expand_modules.py
@@ -6,13 +6,16 @@
 
 import os
 import sys
-from collections.abc import Sequence
 from pathlib import Path
-from re import Pattern
+from typing import TYPE_CHECKING
 
 from astroid import modutils
 
-from pylint.typing import ErrorDescriptionDict, ModuleDescriptionDict
+if TYPE_CHECKING:
+    from re import Pattern
+    from collections.abc import Sequence
+
+    from pylint.typing import ErrorDescriptionDict, ModuleDescriptionDict
 
 
 def _modpath_from_file(filename: str, is_namespace: bool, path: list[str]) -> list[str]:
diff --git a/pylint/lint/message_state_handler.py b/pylint/lint/message_state_handler.py
index 5c4498af96..2892369eac 100644
--- a/pylint/lint/message_state_handler.py
+++ b/pylint/lint/message_state_handler.py
@@ -6,7 +6,7 @@
 
 import tokenize
 from collections import defaultdict
-from typing import TYPE_CHECKING, Literal
+from typing import TYPE_CHECKING
 
 from pylint import exceptions, interfaces
 from pylint.constants import (
@@ -17,8 +17,7 @@
     MSG_TYPES_LONG,
 )
 from pylint.interfaces import HIGH
-from pylint.message import MessageDefinition
-from pylint.typing import ManagedMessage, MessageDefinitionTuple
+from pylint.typing import ManagedMessage
 from pylint.utils.pragma_parser import (
     OPTION_PO,
     InvalidPragmaError,
@@ -27,7 +26,11 @@
 )
 
 if TYPE_CHECKING:
+    from typing import Literal
+
     from pylint.lint.pylinter import PyLinter
+    from pylint.message import MessageDefinition
+    from pylint.typing import MessageDefinitionTuple
 
 
 class _MessageStateHandler:
diff --git a/pylint/lint/parallel.py b/pylint/lint/parallel.py
index af381494c3..07710fb36c 100644
--- a/pylint/lint/parallel.py
+++ b/pylint/lint/parallel.py
@@ -6,16 +6,13 @@
 
 import functools
 from collections import defaultdict
-from collections.abc import Iterable, Sequence
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING
 
 import dill
 
 from pylint import reporters
 from pylint.lint.utils import _augment_sys_path
-from pylint.message import Message
-from pylint.typing import FileItem
-from pylint.utils import LinterStats, merge_stats
+from pylint.utils import merge_stats
 
 try:
     import multiprocessing
@@ -28,7 +25,13 @@
     ProcessPoolExecutor = None  # type: ignore[assignment,misc]
 
 if TYPE_CHECKING:
+    from typing import Any
+    from collections.abc import Iterable, Sequence
+
     from pylint.lint import PyLinter
+    from pylint.message import Message
+    from pylint.typing import FileItem
+    from pylint.utils import LinterStats
 
 # PyLinter object used by worker processes when checking files using parallel mode
 # should only be used by the worker processes
diff --git a/pylint/lint/pylinter.py b/pylint/lint/pylinter.py
index cc4605b96a..6156f6b2ac 100644
--- a/pylint/lint/pylinter.py
+++ b/pylint/lint/pylinter.py
@@ -4,8 +4,6 @@
 
 from __future__ import annotations
 
-import argparse
-import collections
 import contextlib
 import functools
 import os
@@ -13,15 +11,11 @@
 import tokenize
 import traceback
 from collections import defaultdict
-from collections.abc import Callable, Iterable, Iterator, Sequence
 from io import TextIOWrapper
 from pathlib import Path
-from re import Pattern
-from types import ModuleType
-from typing import Any, Protocol
+from typing import TYPE_CHECKING, Protocol
 
 import astroid
-from astroid import nodes
 
 from pylint import checkers, exceptions, interfaces, reporters
 from pylint.checkers.base_checker import BaseChecker
@@ -52,21 +46,35 @@
     get_fatal_error_message,
     prepare_crash_report,
 )
-from pylint.message import Message, MessageDefinition, MessageDefinitionStore
+from pylint.message import Message, MessageDefinitionStore
 from pylint.reporters.base_reporter import BaseReporter
 from pylint.reporters.text import TextReporter
 from pylint.reporters.ureports import nodes as report_nodes
 from pylint.typing import (
-    DirectoryNamespaceDict,
     FileItem,
-    ManagedMessage,
-    MessageDefinitionTuple,
     MessageLocationTuple,
-    ModuleDescriptionDict,
-    Options,
 )
 from pylint.utils import ASTWalker, FileState, LinterStats, utils
 
+if TYPE_CHECKING:
+    import argparse
+    from re import Pattern
+    from types import ModuleType
+    from typing import Any
+    from collections.abc import Callable, Iterable, Iterator, Sequence
+
+    from astroid import nodes
+
+    from pylint.message import MessageDefinition
+    from pylint.typing import (
+        DirectoryNamespaceDict,
+        ManagedMessage,
+        MessageDefinitionTuple,
+        ModuleDescriptionDict,
+        Options,
+    )
+
+
 MANAGER = astroid.MANAGER
 
 
@@ -255,7 +263,7 @@ class PyLinter(
     _ArgumentsManager,
     _MessageStateHandler,
     reporters.ReportsHandlerMixIn,
-    checkers.BaseChecker,
+    BaseChecker,
 ):
     """Lint Python modules using external checkers.
 
@@ -307,9 +315,7 @@ def __init__(
         """Dictionary of possible but non-initialized reporters."""
 
         # Attributes for checkers and plugins
-        self._checkers: defaultdict[str, list[checkers.BaseChecker]] = (
-            collections.defaultdict(list)
-        )
+        self._checkers: defaultdict[str, list[BaseChecker]] = defaultdict(list)
         """Dictionary of registered and initialized checkers."""
         self._dynamic_plugins: dict[str, ModuleType | ModuleNotFoundError | bool] = {}
         """Set of loaded plugin names."""
@@ -331,7 +337,7 @@ def __init__(
         self._error_mode = False
 
         reporters.ReportsHandlerMixIn.__init__(self)
-        checkers.BaseChecker.__init__(self, self)
+        BaseChecker.__init__(self, self)
         # provided reports
         self.reports = (
             ("RP0001", "Messages by category", report_total_messages_stats),
@@ -482,7 +488,7 @@ def report_order(self) -> list[BaseChecker]:
 
     # checkers manipulation methods ############################################
 
-    def register_checker(self, checker: checkers.BaseChecker) -> None:
+    def register_checker(self, checker: BaseChecker) -> None:
         """This method auto registers the checker."""
         self._checkers[checker.name].append(checker)
         for r_id, r_title, r_cb in checker.reports:
@@ -1313,4 +1319,4 @@ def _emit_stashed_messages(self) -> None:
                     line=0,
                     confidence=HIGH,
                 )
-        self._stashed_messages = collections.defaultdict(list)
+        self._stashed_messages = defaultdict(list)
diff --git a/pylint/lint/report_functions.py b/pylint/lint/report_functions.py
index 72734e4688..c4ba35c4fb 100644
--- a/pylint/lint/report_functions.py
+++ b/pylint/lint/report_functions.py
@@ -4,14 +4,17 @@
 
 from __future__ import annotations
 
-import collections
 from collections import defaultdict
 from typing import cast
+from typing import TYPE_CHECKING
 
 from pylint import checkers, exceptions
-from pylint.reporters.ureports.nodes import Section, Table
+from pylint.reporters.ureports.nodes import Table
 from pylint.typing import MessageTypesFullName
-from pylint.utils import LinterStats
+
+if TYPE_CHECKING:
+    from pylint.utils import LinterStats
+    from pylint.reporters.ureports.nodes import Section
 
 
 def report_total_messages_stats(
@@ -54,7 +57,7 @@ def report_messages_by_module_stats(
     if len(module_stats) == 1:
         # don't print this report when we are analysing a single module
         raise exceptions.EmptyReportError()
-    by_mod: defaultdict[str, dict[str, int | float]] = collections.defaultdict(dict)
+    by_mod: defaultdict[str, dict[str, int | float]] = defaultdict(dict)
     for m_type in ("fatal", "error", "warning", "refactor", "convention"):
         m_type = cast(MessageTypesFullName, m_type)
         total = stats.get_global_message_count(m_type)
diff --git a/pylint/lint/run.py b/pylint/lint/run.py
index 2bbbb337b9..acc8576769 100644
--- a/pylint/lint/run.py
+++ b/pylint/lint/run.py
@@ -7,9 +7,8 @@
 import os
 import sys
 import warnings
-from collections.abc import Sequence
 from pathlib import Path
-from typing import ClassVar
+from typing import TYPE_CHECKING
 
 from pylint import config
 from pylint.checkers.utils import clear_lru_caches
@@ -23,7 +22,13 @@
 from pylint.constants import full_version
 from pylint.lint.base_options import _make_run_options
 from pylint.lint.pylinter import MANAGER, PyLinter
-from pylint.reporters.base_reporter import BaseReporter
+
+if TYPE_CHECKING:
+    from typing import ClassVar
+    from collections.abc import Sequence
+
+    from pylint.reporters.base_reporter import BaseReporter
+
 
 try:
     import multiprocessing
diff --git a/pylint/lint/utils.py b/pylint/lint/utils.py
index c5487a8c6d..9064408dd1 100644
--- a/pylint/lint/utils.py
+++ b/pylint/lint/utils.py
@@ -8,12 +8,15 @@
 import platform
 import sys
 import traceback
-from collections.abc import Iterator, Sequence
 from datetime import datetime
 from pathlib import Path
+from typing import TYPE_CHECKING
 
 from pylint.constants import PYLINT_HOME, full_version
 
+if TYPE_CHECKING:
+    from collections.abc import Iterator, Sequence
+
 
 def prepare_crash_report(ex: Exception, filepath: str, crash_file_path: str) -> Path:
     issue_template_path = (
diff --git a/pylint/message/message.py b/pylint/message/message.py
index 6ee8c5f789..62e56d971b 100644
--- a/pylint/message/message.py
+++ b/pylint/message/message.py
@@ -5,11 +5,15 @@
 from __future__ import annotations
 
 from dataclasses import asdict, dataclass
+from typing import TYPE_CHECKING
 
 from pylint.constants import MSG_TYPES
-from pylint.interfaces import UNDEFINED, Confidence
+from pylint.interfaces import UNDEFINED
 from pylint.typing import MessageLocationTuple
 
+if TYPE_CHECKING:
+    from pylint.interfaces import Confidence
+
 
 @dataclass(unsafe_hash=True)
 class Message:  # pylint: disable=too-many-instance-attributes
diff --git a/pylint/message/message_definition.py b/pylint/message/message_definition.py
index a318cc83f7..62e866470b 100644
--- a/pylint/message/message_definition.py
+++ b/pylint/message/message_definition.py
@@ -4,16 +4,17 @@
 
 from __future__ import annotations
 
-import sys
 from typing import TYPE_CHECKING
 
-from astroid import nodes
-
 from pylint.constants import _SCOPE_EXEMPT, MSG_TYPES, WarningScope
 from pylint.exceptions import InvalidMessageError
 from pylint.utils import normalize_text
 
 if TYPE_CHECKING:
+    import sys
+
+    from astroid import nodes
+
     from pylint.checkers import BaseChecker
 
 
diff --git a/pylint/message/message_definition_store.py b/pylint/message/message_definition_store.py
index d56308541a..8ddd651fe1 100644
--- a/pylint/message/message_definition_store.py
+++ b/pylint/message/message_definition_store.py
@@ -6,16 +6,17 @@
 
 import collections
 import sys
-from collections.abc import Sequence, ValuesView
 from functools import cache
 from typing import TYPE_CHECKING
 
 from pylint.exceptions import UnknownMessageError
-from pylint.message.message_definition import MessageDefinition
 from pylint.message.message_id_store import MessageIdStore
 
 if TYPE_CHECKING:
+    from collections.abc import Sequence, ValuesView
+
     from pylint.checkers import BaseChecker
+    from pylint.message.message_definition import MessageDefinition
 
 
 class MessageDefinitionStore:
diff --git a/pylint/message/message_id_store.py b/pylint/message/message_id_store.py
index b07a9c3f70..4046be1d4a 100644
--- a/pylint/message/message_id_store.py
+++ b/pylint/message/message_id_store.py
@@ -4,7 +4,7 @@
 
 from __future__ import annotations
 
-from typing import NoReturn
+from typing import TYPE_CHECKING
 
 from pylint.exceptions import (
     DeletedMessageError,
@@ -19,6 +19,9 @@
     is_moved_symbol,
 )
 
+if TYPE_CHECKING:
+    from typing import NoReturn
+
 
 class MessageIdStore:
     """The MessageIdStore store MessageId and make sure that there is a 1-1 relation
diff --git a/pylint/pyreverse/diadefslib.py b/pylint/pyreverse/diadefslib.py
index 59a2f59560..bd3e42c25f 100644
--- a/pylint/pyreverse/diadefslib.py
+++ b/pylint/pyreverse/diadefslib.py
@@ -6,18 +6,22 @@
 
 from __future__ import annotations
 
-import argparse
-from collections.abc import Generator
-from typing import Any
+from typing import TYPE_CHECKING
 
 import astroid
 from astroid import nodes
 from astroid.modutils import is_stdlib_module
 
 from pylint.pyreverse.diagrams import ClassDiagram, PackageDiagram
-from pylint.pyreverse.inspector import Linker, Project
 from pylint.pyreverse.utils import LocalsVisitor
 
+if TYPE_CHECKING:
+    import argparse
+    from collections.abc import Generator
+    from typing import Any
+
+    from pylint.pyreverse.inspector import Linker, Project
+
 # diagram generators ##########################################################
 
 
diff --git a/pylint/pyreverse/diagrams.py b/pylint/pyreverse/diagrams.py
index 278102cab8..0b13d2e7df 100644
--- a/pylint/pyreverse/diagrams.py
+++ b/pylint/pyreverse/diagrams.py
@@ -6,8 +6,7 @@
 
 from __future__ import annotations
 
-from collections.abc import Iterable
-from typing import Any
+from typing import TYPE_CHECKING
 
 import astroid
 from astroid import nodes, util
@@ -15,6 +14,10 @@
 from pylint.checkers.utils import decorated_with_property, in_type_checking_block
 from pylint.pyreverse.utils import FilterMixIn
 
+if TYPE_CHECKING:
+    from collections.abc import Iterable
+    from typing import Any
+
 
 class Figure:
     """Base class for counter handling."""
diff --git a/pylint/pyreverse/dot_printer.py b/pylint/pyreverse/dot_printer.py
index 4baed6c3c2..43adda4983 100644
--- a/pylint/pyreverse/dot_printer.py
+++ b/pylint/pyreverse/dot_printer.py
@@ -11,12 +11,14 @@
 import tempfile
 from enum import Enum
 from pathlib import Path
-
-from astroid import nodes
+from typing import TYPE_CHECKING
 
 from pylint.pyreverse.printer import EdgeType, Layout, NodeProperties, NodeType, Printer
 from pylint.pyreverse.utils import get_annotation_label
 
+if TYPE_CHECKING:
+    from astroid import nodes
+
 
 class HTMLLabels(Enum):
     LINEBREAK_LEFT = '<br ALIGN="LEFT"/>'
diff --git a/pylint/pyreverse/main.py b/pylint/pyreverse/main.py
index 3ba0b6c77d..ed014ea0ae 100644
--- a/pylint/pyreverse/main.py
+++ b/pylint/pyreverse/main.py
@@ -7,8 +7,7 @@
 from __future__ import annotations
 
 import sys
-from collections.abc import Sequence
-from typing import NoReturn
+from typing import TYPE_CHECKING
 
 from pylint import constants
 from pylint.config.arguments_manager import _ArgumentsManager
@@ -23,7 +22,13 @@
     check_if_graphviz_supports_format,
     insert_default_options,
 )
-from pylint.typing import Options
+
+if TYPE_CHECKING:
+    from collections.abc import Sequence
+    from typing import NoReturn
+
+    from pylint.typing import Options
+
 
 DIRECTLY_SUPPORTED_FORMATS = (
     "dot",
diff --git a/pylint/pyreverse/printer.py b/pylint/pyreverse/printer.py
index caa7917ca0..1c31a5ef02 100644
--- a/pylint/pyreverse/printer.py
+++ b/pylint/pyreverse/printer.py
@@ -9,11 +9,13 @@
 from abc import ABC, abstractmethod
 from enum import Enum
 from typing import NamedTuple
-
-from astroid import nodes
+from typing import TYPE_CHECKING
 
 from pylint.pyreverse.utils import get_annotation_label
 
+if TYPE_CHECKING:
+    from astroid import nodes
+
 
 class NodeType(Enum):
     CLASS = "class"
diff --git a/pylint/pyreverse/printer_factory.py b/pylint/pyreverse/printer_factory.py
index fdbe480ed5..30d3d7f47f 100644
--- a/pylint/pyreverse/printer_factory.py
+++ b/pylint/pyreverse/printer_factory.py
@@ -4,10 +4,15 @@
 
 from __future__ import annotations
 
+from typing import TYPE_CHECKING
+
 from pylint.pyreverse.dot_printer import DotPrinter
 from pylint.pyreverse.mermaidjs_printer import HTMLMermaidJSPrinter, MermaidJSPrinter
 from pylint.pyreverse.plantuml_printer import PlantUmlPrinter
-from pylint.pyreverse.printer import Printer
+
+if TYPE_CHECKING:
+    from pylint.pyreverse.printer import Printer
+
 
 filetype_to_printer: dict[str, type[Printer]] = {
     "plantuml": PlantUmlPrinter,
diff --git a/pylint/pyreverse/utils.py b/pylint/pyreverse/utils.py
index 5ad92d3231..b5c73935f5 100644
--- a/pylint/pyreverse/utils.py
+++ b/pylint/pyreverse/utils.py
@@ -11,14 +11,17 @@
 import shutil
 import subprocess
 import sys
-from collections.abc import Callable
-from typing import TYPE_CHECKING, Any, Optional, Union
+from typing import TYPE_CHECKING
 
 import astroid
 from astroid import nodes
-from astroid.typing import InferenceResult
 
 if TYPE_CHECKING:
+    from collections.abc import Callable
+    from typing import Any, Optional, Union
+
+    from astroid.typing import InferenceResult
+
     from pylint.pyreverse.diagrams import ClassDiagram, PackageDiagram
 
     _CallbackT = Callable[
diff --git a/pylint/pyreverse/writer.py b/pylint/pyreverse/writer.py
index 093c459598..ca2ff7e063 100644
--- a/pylint/pyreverse/writer.py
+++ b/pylint/pyreverse/writer.py
@@ -6,25 +6,30 @@
 
 from __future__ import annotations
 
-import argparse
 import itertools
 import os
 from collections import defaultdict
-from collections.abc import Iterable
+from typing import TYPE_CHECKING
 
 from astroid import modutils, nodes
 
-from pylint.pyreverse.diagrams import (
-    ClassDiagram,
-    ClassEntity,
-    DiagramEntity,
-    PackageDiagram,
-    PackageEntity,
-)
-from pylint.pyreverse.printer import EdgeType, NodeProperties, NodeType, Printer
+from pylint.pyreverse.diagrams import PackageDiagram
+from pylint.pyreverse.printer import EdgeType, NodeProperties, NodeType
 from pylint.pyreverse.printer_factory import get_printer_for_filetype
 from pylint.pyreverse.utils import is_exception
 
+if TYPE_CHECKING:
+    import argparse
+    from collections.abc import Iterable
+
+    from pylint.pyreverse.diagrams import (
+        ClassDiagram,
+        ClassEntity,
+        DiagramEntity,
+        PackageEntity,
+    )
+    from pylint.pyreverse.printer import Printer
+
 
 class DiagramWriter:
     """Base class for writing project diagrams."""
diff --git a/pylint/reporters/base_reporter.py b/pylint/reporters/base_reporter.py
index d370b1910e..593e1a49f9 100644
--- a/pylint/reporters/base_reporter.py
+++ b/pylint/reporters/base_reporter.py
@@ -6,15 +6,17 @@
 
 import os
 import sys
-from typing import TYPE_CHECKING, TextIO
+from typing import TYPE_CHECKING
 
-from pylint.message import Message
 from pylint.reporters.ureports.nodes import Text
-from pylint.utils import LinterStats
 
 if TYPE_CHECKING:
+    from typing import TextIO
+
     from pylint.lint.pylinter import PyLinter
+    from pylint.message import Message
     from pylint.reporters.ureports.nodes import Section
+    from pylint.utils import LinterStats
 
 
 class BaseReporter:
diff --git a/pylint/reporters/multi_reporter.py b/pylint/reporters/multi_reporter.py
index 0c27293b7a..9d8b44d887 100644
--- a/pylint/reporters/multi_reporter.py
+++ b/pylint/reporters/multi_reporter.py
@@ -5,17 +5,18 @@
 from __future__ import annotations
 
 import os
-from collections.abc import Callable
 from copy import copy
-from typing import TYPE_CHECKING, TextIO
-
-from pylint.message import Message
-from pylint.reporters.base_reporter import BaseReporter
-from pylint.utils import LinterStats
+from typing import TYPE_CHECKING
 
 if TYPE_CHECKING:
+    from collections.abc import Callable
+    from typing import TextIO
+
     from pylint.lint import PyLinter
+    from pylint.message import Message
     from pylint.reporters.ureports.nodes import Section
+    from pylint.reporters.base_reporter import BaseReporter
+    from pylint.utils import LinterStats
 
 
 class MultiReporter:
diff --git a/pylint/reporters/reports_handler_mix_in.py b/pylint/reporters/reports_handler_mix_in.py
index 071879ca1e..2f827ffacf 100644
--- a/pylint/reporters/reports_handler_mix_in.py
+++ b/pylint/reporters/reports_handler_mix_in.py
@@ -5,21 +5,23 @@
 from __future__ import annotations
 
 import collections
-from collections.abc import MutableSequence
 from typing import TYPE_CHECKING
 
 from pylint.exceptions import EmptyReportError
 from pylint.reporters.ureports.nodes import Section
 from pylint.typing import ReportsCallable
-from pylint.utils import LinterStats
 
 if TYPE_CHECKING:
+    from collections.abc import MutableSequence
+
     from pylint.checkers import BaseChecker
     from pylint.lint.pylinter import PyLinter
+    from pylint.utils import LinterStats
 
-ReportsDict = collections.defaultdict[
-    "BaseChecker", list[tuple[str, str, ReportsCallable]]
-]
+    ReportsDict = collections.defaultdict[
+        BaseChecker,
+        list[tuple[str, str, ReportsCallable]],
+    ]
 
 
 class ReportsHandlerMixIn:
diff --git a/pylint/reporters/text.py b/pylint/reporters/text.py
index 894207ad7d..2685f93e9c 100644
--- a/pylint/reporters/text.py
+++ b/pylint/reporters/text.py
@@ -15,13 +15,15 @@
 import sys
 import warnings
 from dataclasses import asdict, fields
-from typing import TYPE_CHECKING, NamedTuple, TextIO
+from typing import TYPE_CHECKING, NamedTuple
 
 from pylint.message import Message
 from pylint.reporters import BaseReporter
 from pylint.reporters.ureports.text_writer import TextWriter
 
 if TYPE_CHECKING:
+    from typing import TextIO
+
     from pylint.lint import PyLinter
     from pylint.reporters.ureports.nodes import Section
 
diff --git a/pylint/reporters/ureports/base_writer.py b/pylint/reporters/ureports/base_writer.py
index 9a12123cbd..3cd9bfb682 100644
--- a/pylint/reporters/ureports/base_writer.py
+++ b/pylint/reporters/ureports/base_writer.py
@@ -11,11 +11,13 @@
 from __future__ import annotations
 
 import sys
-from collections.abc import Iterator
 from io import StringIO
-from typing import TYPE_CHECKING, TextIO
+from typing import TYPE_CHECKING
 
 if TYPE_CHECKING:
+    from collections.abc import Iterator
+    from typing import TextIO
+
     from pylint.reporters.ureports.nodes import (
         BaseLayout,
         EvaluationSection,
diff --git a/pylint/reporters/ureports/nodes.py b/pylint/reporters/ureports/nodes.py
index c414865121..72c87781d2 100644
--- a/pylint/reporters/ureports/nodes.py
+++ b/pylint/reporters/ureports/nodes.py
@@ -9,14 +9,17 @@
 
 from __future__ import annotations
 
-from collections.abc import Callable, Iterable, Iterator
-from typing import Any, TypeVar
+from typing import TYPE_CHECKING
 
-from pylint.reporters.ureports.base_writer import BaseWriter
+if TYPE_CHECKING:
+    from collections.abc import Callable, Iterable, Iterator
+    from typing import Any, TypeVar
 
-_T = TypeVar("_T")
-_VNodeT = TypeVar("_VNodeT", bound="VNode")
-VisitLeaveFunction = Callable[[_T, Any, Any], None]
+    from pylint.reporters.ureports.base_writer import BaseWriter
+
+    _T = TypeVar("_T")
+    _VNodeT = TypeVar("_VNodeT", bound="VNode")
+    VisitLeaveFunction = Callable[[_T, Any, Any], None]
 
 
 class VNode:
diff --git a/pylint/testutils/_primer/package_to_lint.py b/pylint/testutils/_primer/package_to_lint.py
index fb65a90ad9..ca435c4f5e 100644
--- a/pylint/testutils/_primer/package_to_lint.py
+++ b/pylint/testutils/_primer/package_to_lint.py
@@ -6,12 +6,16 @@
 
 import logging
 from pathlib import Path
-from typing import Literal
+from typing import TYPE_CHECKING
 
 from git import GitCommandError
 from git.cmd import Git
 from git.repo import Repo
 
+if TYPE_CHECKING:
+    from typing import Literal
+
+
 PRIMER_DIRECTORY_PATH = Path("tests") / ".pylint_primer_tests"
 
 
diff --git a/pylint/testutils/_primer/primer.py b/pylint/testutils/_primer/primer.py
index 5fd83f442e..28089cfdeb 100644
--- a/pylint/testutils/_primer/primer.py
+++ b/pylint/testutils/_primer/primer.py
@@ -7,14 +7,18 @@
 import argparse
 import json
 import sys
-from pathlib import Path
+from typing import TYPE_CHECKING
 
-from pylint.testutils._primer import PackageToLint
-from pylint.testutils._primer.primer_command import PrimerCommand
 from pylint.testutils._primer.primer_compare_command import CompareCommand
 from pylint.testutils._primer.primer_prepare_command import PrepareCommand
 from pylint.testutils._primer.primer_run_command import RunCommand
 
+if TYPE_CHECKING:
+    from pathlib import Path
+
+    from pylint.testutils._primer import PackageToLint
+    from pylint.testutils._primer.primer_command import PrimerCommand
+
 
 class Primer:
     """Main class to handle priming of packages."""
diff --git a/pylint/testutils/_primer/primer_command.py b/pylint/testutils/_primer/primer_command.py
index 01c2bed368..adf434a7dc 100644
--- a/pylint/testutils/_primer/primer_command.py
+++ b/pylint/testutils/_primer/primer_command.py
@@ -5,12 +5,14 @@
 from __future__ import annotations
 
 import abc
-import argparse
-from pathlib import Path
-from typing import TypedDict
+from typing import TypedDict, TYPE_CHECKING
 
-from pylint.reporters.json_reporter import OldJsonExport
-from pylint.testutils._primer import PackageToLint
+if TYPE_CHECKING:
+    import argparse
+    from pathlib import Path
+
+    from pylint.reporters.json_reporter import OldJsonExport
+    from pylint.testutils._primer import PackageToLint
 
 
 class PackageData(TypedDict):
diff --git a/pylint/testutils/_primer/primer_compare_command.py b/pylint/testutils/_primer/primer_compare_command.py
index 7b245b9e19..c36384b631 100644
--- a/pylint/testutils/_primer/primer_compare_command.py
+++ b/pylint/testutils/_primer/primer_compare_command.py
@@ -4,15 +4,20 @@
 from __future__ import annotations
 
 import json
-from pathlib import Path, PurePosixPath
+from pathlib import PurePosixPath
+from typing import TYPE_CHECKING
 
-from pylint.reporters.json_reporter import OldJsonExport
 from pylint.testutils._primer.primer_command import (
     PackageData,
-    PackageMessages,
     PrimerCommand,
 )
 
+if TYPE_CHECKING:
+    from pathlib import Path
+    from pylint.reporters.json_reporter import OldJsonExport
+    from pylint.testutils._primer.primer_command import PackageMessages
+
+
 MAX_GITHUB_COMMENT_LENGTH = 65536
 
 
diff --git a/pylint/testutils/_primer/primer_run_command.py b/pylint/testutils/_primer/primer_run_command.py
index 96a1440e7c..8efbd738d0 100644
--- a/pylint/testutils/_primer/primer_run_command.py
+++ b/pylint/testutils/_primer/primer_run_command.py
@@ -8,19 +8,24 @@
 import sys
 import warnings
 from io import StringIO
+from typing import TYPE_CHECKING
 
 from git.repo import Repo
 
 from pylint.lint import Run
-from pylint.message import Message
-from pylint.reporters.json_reporter import JSONReporter, OldJsonExport
-from pylint.testutils._primer.package_to_lint import PackageToLint
+from pylint.reporters.json_reporter import JSONReporter
 from pylint.testutils._primer.primer_command import (
     PackageData,
-    PackageMessages,
     PrimerCommand,
 )
 
+if TYPE_CHECKING:
+    from pylint.message import Message
+    from pylint.reporters.json_reporter import OldJsonExport
+    from pylint.testutils._primer.package_to_lint import PackageToLint
+    from pylint.testutils._primer.primer_command import PackageMessages
+
+
 GITHUB_CRASH_TEMPLATE_LOCATION = "/home/runner/.cache"
 CRASH_TEMPLATE_INTRO = "There is a pre-filled template"
 
diff --git a/pylint/testutils/_run.py b/pylint/testutils/_run.py
index f42cb8d6a4..85ae0b673b 100644
--- a/pylint/testutils/_run.py
+++ b/pylint/testutils/_run.py
@@ -9,12 +9,16 @@
 
 from __future__ import annotations
 
-from collections.abc import Sequence
+from typing import TYPE_CHECKING
 
 from pylint.lint import Run as LintRun
-from pylint.reporters.base_reporter import BaseReporter
 from pylint.testutils.lint_module_test import PYLINTRC
 
+if TYPE_CHECKING:
+    from collections.abc import Sequence
+
+    from pylint.reporters.base_reporter import BaseReporter
+
 
 def _add_rcfile_default_pylintrc(args: list[str]) -> list[str]:
     """Add a default pylintrc with the rcfile option in a list of pylint args."""
diff --git a/pylint/testutils/checker_test_case.py b/pylint/testutils/checker_test_case.py
index 951f38c0b9..85115cd178 100644
--- a/pylint/testutils/checker_test_case.py
+++ b/pylint/testutils/checker_test_case.py
@@ -5,16 +5,20 @@
 from __future__ import annotations
 
 import contextlib
-from collections.abc import Generator, Iterator
-from typing import Any
-
-from astroid import nodes
+from typing import TYPE_CHECKING
 
 from pylint.testutils.global_test_linter import linter
-from pylint.testutils.output_line import MessageTest
 from pylint.testutils.unittest_linter import UnittestLinter
 from pylint.utils import ASTWalker
 
+if TYPE_CHECKING:
+    from collections.abc import Generator, Iterator
+    from typing import Any
+
+    from astroid import nodes
+
+    from pylint.testutils.output_line import MessageTest
+
 
 class CheckerTestCase:
     """A base testcase class for unit testing individual checker classes."""
diff --git a/pylint/testutils/decorator.py b/pylint/testutils/decorator.py
index c206921329..69e2f8ea6c 100644
--- a/pylint/testutils/decorator.py
+++ b/pylint/testutils/decorator.py
@@ -5,10 +5,13 @@
 from __future__ import annotations
 
 import functools
-from collections.abc import Callable
-from typing import Any
+from typing import TYPE_CHECKING
 
-from pylint.testutils.checker_test_case import CheckerTestCase
+if TYPE_CHECKING:
+    from collections.abc import Callable
+    from typing import Any
+
+    from pylint.testutils.checker_test_case import CheckerTestCase
 
 
 def set_config(**kwargs: Any) -> Callable[[Callable[..., None]], Callable[..., None]]:
diff --git a/pylint/testutils/functional/find_functional_tests.py b/pylint/testutils/functional/find_functional_tests.py
index f2e636687b..cb06e12dd0 100644
--- a/pylint/testutils/functional/find_functional_tests.py
+++ b/pylint/testutils/functional/find_functional_tests.py
@@ -5,11 +5,15 @@
 from __future__ import annotations
 
 import os
-from collections.abc import Iterator
 from pathlib import Path
+from typing import TYPE_CHECKING
 
 from pylint.testutils.functional.test_file import FunctionalTestFile
 
+if TYPE_CHECKING:
+    from collections.abc import Iterator
+
+
 REASONABLY_DISPLAYABLE_VERTICALLY = 49
 """'Wet finger' number of files that are reasonable to display by an IDE.
 
diff --git a/pylint/testutils/functional/lint_module_output_update.py b/pylint/testutils/functional/lint_module_output_update.py
index 38ed465aad..aaf5019651 100644
--- a/pylint/testutils/functional/lint_module_output_update.py
+++ b/pylint/testutils/functional/lint_module_output_update.py
@@ -6,9 +6,13 @@
 
 import csv
 import os
+from typing import TYPE_CHECKING
 
-from pylint.testutils.lint_module_test import LintModuleTest, MessageCounter
-from pylint.testutils.output_line import OutputLine
+from pylint.testutils.lint_module_test import LintModuleTest
+
+if TYPE_CHECKING:
+    from pylint.testutils.lint_module_test import MessageCounter
+    from pylint.testutils.output_line import OutputLine
 
 
 class LintModuleOutputUpdate(LintModuleTest):
diff --git a/pylint/testutils/functional/test_file.py b/pylint/testutils/functional/test_file.py
index 37ba3a5fc6..223c890230 100644
--- a/pylint/testutils/functional/test_file.py
+++ b/pylint/testutils/functional/test_file.py
@@ -5,9 +5,11 @@
 from __future__ import annotations
 
 import configparser
-from collections.abc import Callable
 from os.path import basename, exists, join
-from typing import TypedDict
+from typing import TypedDict, TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from collections.abc import Callable
 
 
 def parse_python_version(ver_str: str) -> tuple[int, ...]:
diff --git a/pylint/testutils/lint_module_test.py b/pylint/testutils/lint_module_test.py
index 37839c8908..efd676bf55 100644
--- a/pylint/testutils/lint_module_test.py
+++ b/pylint/testutils/lint_module_test.py
@@ -11,27 +11,33 @@
 from collections import Counter
 from io import StringIO
 from pathlib import Path
-from typing import TextIO
+from typing import TYPE_CHECKING
 
 import pytest
-from _pytest.config import Config
 
 from pylint import checkers
 from pylint.config.config_initialization import _config_initialization
 from pylint.lint import PyLinter
-from pylint.message.message import Message
 from pylint.testutils.constants import _EXPECTED_RE, _OPERATORS, UPDATE_OPTION
 
 # need to import from functional.test_file to avoid cyclic import
 from pylint.testutils.functional.test_file import (
-    FunctionalTestFile,
     NoFileError,
     parse_python_version,
 )
 from pylint.testutils.output_line import OutputLine
 from pylint.testutils.reporter_for_tests import FunctionalTestReporter
 
-MessageCounter = Counter[tuple[int, str]]
+if TYPE_CHECKING:
+    from typing import TextIO
+
+    from _pytest.config import Config
+
+    from pylint.message.message import Message
+    from pylint.testutils.functional.test_file import FunctionalTestFile
+
+    MessageCounter = Counter[tuple[int, str]]
+
 
 PYLINTRC = Path(__file__).parent / "testing_pylintrc"
 
diff --git a/pylint/testutils/output_line.py b/pylint/testutils/output_line.py
index fbe5b3bbce..e79164a4c3 100644
--- a/pylint/testutils/output_line.py
+++ b/pylint/testutils/output_line.py
@@ -4,15 +4,20 @@
 
 from __future__ import annotations
 
-from collections.abc import Sequence
-from typing import Any, NamedTuple, TypeVar
+from typing import TYPE_CHECKING, NamedTuple
 
-from astroid import nodes
+from pylint.interfaces import UNDEFINED
 
-from pylint.interfaces import UNDEFINED, Confidence
-from pylint.message.message import Message
+if TYPE_CHECKING:
+    from collections.abc import Sequence
+    from typing import Any, TypeVar
 
-_T = TypeVar("_T")
+    from astroid import nodes
+
+    from pylint.interfaces import Confidence
+    from pylint.message.message import Message
+
+    _T = TypeVar("_T")
 
 
 class MessageTest(NamedTuple):
diff --git a/pylint/testutils/pyreverse.py b/pylint/testutils/pyreverse.py
index 115eda416a..abae9f9639 100644
--- a/pylint/testutils/pyreverse.py
+++ b/pylint/testutils/pyreverse.py
@@ -7,11 +7,13 @@
 import argparse
 import configparser
 import shlex
-from pathlib import Path
-from typing import NamedTuple, TypedDict
+from typing import TYPE_CHECKING, NamedTuple, TypedDict
 
 from pylint.pyreverse.main import DEFAULT_COLOR_PALETTE
 
+if TYPE_CHECKING:
+    from pathlib import Path
+
 
 # This class could and should be replaced with a simple dataclass when support for Python < 3.7 is dropped.
 # A NamedTuple is not possible as some tests need to modify attributes during the test.
diff --git a/pylint/testutils/reporter_for_tests.py b/pylint/testutils/reporter_for_tests.py
index d3c06eecd2..648a3b6f28 100644
--- a/pylint/testutils/reporter_for_tests.py
+++ b/pylint/testutils/reporter_for_tests.py
@@ -8,10 +8,10 @@
 from os import getcwd, sep
 from typing import TYPE_CHECKING
 
-from pylint.message import Message
 from pylint.reporters import BaseReporter
 
 if TYPE_CHECKING:
+    from pylint.message import Message
     from pylint.reporters.ureports.nodes import Section
 
 
diff --git a/pylint/testutils/tokenize_str.py b/pylint/testutils/tokenize_str.py
index dc9ada72a9..9b822ff40c 100644
--- a/pylint/testutils/tokenize_str.py
+++ b/pylint/testutils/tokenize_str.py
@@ -6,7 +6,10 @@
 
 import tokenize
 from io import StringIO
-from tokenize import TokenInfo
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from tokenize import TokenInfo
 
 
 def _tokenize_str(code: str) -> list[TokenInfo]:
diff --git a/pylint/testutils/unittest_linter.py b/pylint/testutils/unittest_linter.py
index a19afec568..7c05cd8641 100644
--- a/pylint/testutils/unittest_linter.py
+++ b/pylint/testutils/unittest_linter.py
@@ -6,14 +6,19 @@
 
 from __future__ import annotations
 
-from typing import Any, Literal
+from typing import TYPE_CHECKING
 
-from astroid import nodes
-
-from pylint.interfaces import UNDEFINED, Confidence
+from pylint.interfaces import UNDEFINED
 from pylint.lint import PyLinter
 from pylint.testutils.output_line import MessageTest
 
+if TYPE_CHECKING:
+    from typing import Any, Literal
+
+    from astroid import nodes
+
+    from pylint.interfaces import Confidence
+
 
 class UnittestLinter(PyLinter):
     """A fake linter class to capture checker messages."""
diff --git a/pylint/testutils/utils.py b/pylint/testutils/utils.py
index 3036d1fd62..10a74d6069 100644
--- a/pylint/testutils/utils.py
+++ b/pylint/testutils/utils.py
@@ -7,10 +7,13 @@
 import contextlib
 import os
 import sys
-from collections.abc import Generator, Iterator
 from copy import copy
-from pathlib import Path
-from typing import TextIO
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from collections.abc import Generator, Iterator
+    from pathlib import Path
+    from typing import TextIO
 
 
 @contextlib.contextmanager
diff --git a/pylint/utils/docs.py b/pylint/utils/docs.py
index ba592c4a45..4b7d91fabd 100644
--- a/pylint/utils/docs.py
+++ b/pylint/utils/docs.py
@@ -7,12 +7,14 @@
 from __future__ import annotations
 
 import sys
-from typing import TYPE_CHECKING, Any, TextIO
+from typing import TYPE_CHECKING
 
 from pylint.constants import MAIN_CHECKER_NAME
 from pylint.utils.utils import get_rst_section, get_rst_title
 
 if TYPE_CHECKING:
+    from typing import Any, TextIO
+
     from pylint.lint.pylinter import PyLinter
 
 
diff --git a/pylint/utils/file_state.py b/pylint/utils/file_state.py
index 45217bb7ea..142c8db3de 100644
--- a/pylint/utils/file_state.py
+++ b/pylint/utils/file_state.py
@@ -4,10 +4,8 @@
 
 from __future__ import annotations
 
-import collections
 from collections import defaultdict
-from collections.abc import Iterator
-from typing import TYPE_CHECKING, Literal
+from typing import TYPE_CHECKING
 
 from astroid import nodes
 
@@ -18,6 +16,9 @@
 )
 
 if TYPE_CHECKING:
+    from collections.abc import Iterator
+    from typing import Literal
+
     from pylint.message import MessageDefinition, MessageDefinitionStore
 
 
@@ -38,9 +39,7 @@ def __init__(
         self.base_name = modname
         self._module_msgs_state: MessageStateDict = {}
         self._raw_module_msgs_state: MessageStateDict = {}
-        self._ignored_msgs: defaultdict[tuple[str, int], set[int]] = (
-            collections.defaultdict(set)
-        )
+        self._ignored_msgs: defaultdict[tuple[str, int], set[int]] = defaultdict(set)
         self._suppression_mapping: dict[tuple[str, int], int] = {}
         self._module = node
         if node:
diff --git a/pylint/utils/linterstats.py b/pylint/utils/linterstats.py
index 53afbcfe21..97b0869a5e 100644
--- a/pylint/utils/linterstats.py
+++ b/pylint/utils/linterstats.py
@@ -4,9 +4,10 @@
 
 from __future__ import annotations
 
-from typing import Literal, TypedDict, cast
+from typing import Literal, TypedDict, cast, TYPE_CHECKING
 
-from pylint.typing import MessageTypesFullName
+if TYPE_CHECKING:
+    from pylint.typing import MessageTypesFullName
 
 
 class BadNames(TypedDict):
diff --git a/pylint/utils/pragma_parser.py b/pylint/utils/pragma_parser.py
index 5e066653e4..aa6fc3448e 100644
--- a/pylint/utils/pragma_parser.py
+++ b/pylint/utils/pragma_parser.py
@@ -5,8 +5,10 @@
 from __future__ import annotations
 
 import re
-from collections.abc import Generator
-from typing import NamedTuple
+from typing import NamedTuple, TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from collections.abc import Generator
 
 # Allow stopping after the first semicolon/hash encountered,
 # so that an option can be continued with the reasons
diff --git a/pylint/utils/utils.py b/pylint/utils/utils.py
index 9316bcb7aa..0f8554c4c8 100644
--- a/pylint/utils/utils.py
+++ b/pylint/utils/utils.py
@@ -14,7 +14,6 @@
 
     HAS_ISORT_5 = False
 
-import argparse
 import codecs
 import os
 import re
@@ -23,18 +22,24 @@
 import tokenize
 import warnings
 from collections import deque
-from collections.abc import Iterable, Sequence
-from io import BufferedReader, BytesIO
 from re import Pattern
-from typing import TYPE_CHECKING, Any, Literal, TextIO, TypeVar, Union
+from typing import TYPE_CHECKING, Literal, TypeVar, Union
 
-from astroid import Module, modutils, nodes
+from astroid import Module, modutils
 
 from pylint.constants import PY_EXTS
-from pylint.typing import OptionDict
 
 if TYPE_CHECKING:
+    import argparse
+    from collections.abc import Iterable, Sequence
+    from io import BufferedReader, BytesIO
+    from typing import Any, TextIO
+
+    from astroid import nodes
+
     from pylint.lint import PyLinter
+    from pylint.typing import OptionDict
+
 
 DEFAULT_LINE_LENGTH = 79
 

From 0977531464ecf62f94fea196cd5f6ce49bdbc56c Mon Sep 17 00:00:00 2001
From: "pre-commit-ci[bot]"
 <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date: Wed, 25 Sep 2024 20:40:09 +0000
Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci
---
 pylint/checkers/base/docstring_checker.py          | 1 -
 pylint/checkers/base_checker.py                    | 2 +-
 pylint/checkers/unicode.py                         | 5 ++---
 pylint/config/arguments_manager.py                 | 4 ++--
 pylint/config/arguments_provider.py                | 4 ++--
 pylint/config/config_initialization.py             | 2 +-
 pylint/extensions/docstyle.py                      | 1 -
 pylint/graph.py                                    | 2 +-
 pylint/lint/base_options.py                        | 2 +-
 pylint/lint/expand_modules.py                      | 2 +-
 pylint/lint/parallel.py                            | 2 +-
 pylint/lint/pylinter.py                            | 7 ++-----
 pylint/lint/report_functions.py                    | 5 ++---
 pylint/lint/run.py                                 | 2 +-
 pylint/pyreverse/printer.py                        | 3 +--
 pylint/reporters/multi_reporter.py                 | 2 +-
 pylint/testutils/_primer/primer_command.py         | 2 +-
 pylint/testutils/_primer/primer_compare_command.py | 6 ++----
 pylint/testutils/_primer/primer_run_command.py     | 5 +----
 pylint/testutils/functional/test_file.py           | 2 +-
 pylint/testutils/lint_module_test.py               | 5 +----
 pylint/utils/linterstats.py                        | 2 +-
 pylint/utils/pragma_parser.py                      | 2 +-
 23 files changed, 27 insertions(+), 43 deletions(-)

diff --git a/pylint/checkers/base/docstring_checker.py b/pylint/checkers/base/docstring_checker.py
index 4e90e8c896..7b4ea92a64 100644
--- a/pylint/checkers/base/docstring_checker.py
+++ b/pylint/checkers/base/docstring_checker.py
@@ -9,7 +9,6 @@
 import re
 from typing import TYPE_CHECKING
 
-
 import astroid
 from astroid import nodes
 
diff --git a/pylint/checkers/base_checker.py b/pylint/checkers/base_checker.py
index 3d239aebc5..8598b35534 100644
--- a/pylint/checkers/base_checker.py
+++ b/pylint/checkers/base_checker.py
@@ -23,8 +23,8 @@
 
     from astroid import nodes
 
-    from pylint.lint import PyLinter
     from pylint.interfaces import Confidence
+    from pylint.lint import PyLinter
     from pylint.typing import (
         MessageDefinitionTuple,
         OptionDict,
diff --git a/pylint/checkers/unicode.py b/pylint/checkers/unicode.py
index 5ea226d0ec..02472adc30 100644
--- a/pylint/checkers/unicode.py
+++ b/pylint/checkers/unicode.py
@@ -19,16 +19,15 @@
 from collections import OrderedDict
 from functools import lru_cache
 from tokenize import detect_encoding
-from typing import TYPE_CHECKING
-from typing import NamedTuple
+from typing import TYPE_CHECKING, NamedTuple
 
 import pylint.interfaces
 import pylint.lint
 from pylint import checkers
 
 if TYPE_CHECKING:
-    from collections.abc import Iterable
     import io
+    from collections.abc import Iterable
     from typing import TypeVar
 
     from astroid import nodes
diff --git a/pylint/config/arguments_manager.py b/pylint/config/arguments_manager.py
index c85b5e4ca4..2d33e4b580 100644
--- a/pylint/config/arguments_manager.py
+++ b/pylint/config/arguments_manager.py
@@ -42,9 +42,9 @@
     from collections.abc import Sequence
     from typing import Any, TextIO
 
-    from pylint.typing import DirectoryNamespaceDict, OptionDict
-    from pylint.config.arguments_provider import _ArgumentsProvider
     from pylint.config.argument import _Argument
+    from pylint.config.arguments_provider import _ArgumentsProvider
+    from pylint.typing import DirectoryNamespaceDict, OptionDict
 
 
 class _ArgumentsManager:
diff --git a/pylint/config/arguments_provider.py b/pylint/config/arguments_provider.py
index 731cf1ff2d..9f0ebd2ce5 100644
--- a/pylint/config/arguments_provider.py
+++ b/pylint/config/arguments_provider.py
@@ -9,11 +9,11 @@
 from typing import TYPE_CHECKING
 
 if TYPE_CHECKING:
-    from typing import Any
     from collections.abc import Iterator
+    from typing import Any
 
-    from pylint.typing import OptionDict, Options
     from pylint.config.arguments_manager import _ArgumentsManager
+    from pylint.typing import OptionDict, Options
 
 
 class _ArgumentsProvider:
diff --git a/pylint/config/config_initialization.py b/pylint/config/config_initialization.py
index e80da1ea11..c05573d1cc 100644
--- a/pylint/config/config_initialization.py
+++ b/pylint/config/config_initialization.py
@@ -19,8 +19,8 @@
 from pylint.utils import utils
 
 if TYPE_CHECKING:
-    from pylint.lint import PyLinter
     from pylint import reporters
+    from pylint.lint import PyLinter
 
 
 def _config_initialization(
diff --git a/pylint/extensions/docstyle.py b/pylint/extensions/docstyle.py
index 4650398e85..701c64fcdb 100644
--- a/pylint/extensions/docstyle.py
+++ b/pylint/extensions/docstyle.py
@@ -7,7 +7,6 @@
 import linecache
 from typing import TYPE_CHECKING
 
-
 from pylint import checkers
 from pylint.checkers.utils import only_required_for_messages
 from pylint.interfaces import HIGH
diff --git a/pylint/graph.py b/pylint/graph.py
index 445ab61209..a041060ae2 100644
--- a/pylint/graph.py
+++ b/pylint/graph.py
@@ -17,8 +17,8 @@
 from typing import TYPE_CHECKING
 
 if TYPE_CHECKING:
-    from typing import Any
     from collections.abc import Sequence
+    from typing import Any
 
 
 def target_info_from_filename(filename: str) -> tuple[str, str, str]:
diff --git a/pylint/lint/base_options.py b/pylint/lint/base_options.py
index 1c91f3fc8e..a2c57c96f9 100644
--- a/pylint/lint/base_options.py
+++ b/pylint/lint/base_options.py
@@ -30,8 +30,8 @@
 )
 
 if TYPE_CHECKING:
-    from pylint.typing import Options
     from pylint.lint import PyLinter, Run
+    from pylint.typing import Options
 
 
 def _make_linter_options(linter: PyLinter) -> Options:
diff --git a/pylint/lint/expand_modules.py b/pylint/lint/expand_modules.py
index 164d8395d5..3c26717350 100644
--- a/pylint/lint/expand_modules.py
+++ b/pylint/lint/expand_modules.py
@@ -12,8 +12,8 @@
 from astroid import modutils
 
 if TYPE_CHECKING:
-    from re import Pattern
     from collections.abc import Sequence
+    from re import Pattern
 
     from pylint.typing import ErrorDescriptionDict, ModuleDescriptionDict
 
diff --git a/pylint/lint/parallel.py b/pylint/lint/parallel.py
index 07710fb36c..73f7f67392 100644
--- a/pylint/lint/parallel.py
+++ b/pylint/lint/parallel.py
@@ -25,8 +25,8 @@
     ProcessPoolExecutor = None  # type: ignore[assignment,misc]
 
 if TYPE_CHECKING:
-    from typing import Any
     from collections.abc import Iterable, Sequence
+    from typing import Any
 
     from pylint.lint import PyLinter
     from pylint.message import Message
diff --git a/pylint/lint/pylinter.py b/pylint/lint/pylinter.py
index 6156f6b2ac..ee97671d85 100644
--- a/pylint/lint/pylinter.py
+++ b/pylint/lint/pylinter.py
@@ -50,18 +50,15 @@
 from pylint.reporters.base_reporter import BaseReporter
 from pylint.reporters.text import TextReporter
 from pylint.reporters.ureports import nodes as report_nodes
-from pylint.typing import (
-    FileItem,
-    MessageLocationTuple,
-)
+from pylint.typing import FileItem, MessageLocationTuple
 from pylint.utils import ASTWalker, FileState, LinterStats, utils
 
 if TYPE_CHECKING:
     import argparse
+    from collections.abc import Callable, Iterable, Iterator, Sequence
     from re import Pattern
     from types import ModuleType
     from typing import Any
-    from collections.abc import Callable, Iterable, Iterator, Sequence
 
     from astroid import nodes
 
diff --git a/pylint/lint/report_functions.py b/pylint/lint/report_functions.py
index c4ba35c4fb..b49a255d67 100644
--- a/pylint/lint/report_functions.py
+++ b/pylint/lint/report_functions.py
@@ -5,16 +5,15 @@
 from __future__ import annotations
 
 from collections import defaultdict
-from typing import cast
-from typing import TYPE_CHECKING
+from typing import TYPE_CHECKING, cast
 
 from pylint import checkers, exceptions
 from pylint.reporters.ureports.nodes import Table
 from pylint.typing import MessageTypesFullName
 
 if TYPE_CHECKING:
-    from pylint.utils import LinterStats
     from pylint.reporters.ureports.nodes import Section
+    from pylint.utils import LinterStats
 
 
 def report_total_messages_stats(
diff --git a/pylint/lint/run.py b/pylint/lint/run.py
index acc8576769..8e70fc4ace 100644
--- a/pylint/lint/run.py
+++ b/pylint/lint/run.py
@@ -24,8 +24,8 @@
 from pylint.lint.pylinter import MANAGER, PyLinter
 
 if TYPE_CHECKING:
-    from typing import ClassVar
     from collections.abc import Sequence
+    from typing import ClassVar
 
     from pylint.reporters.base_reporter import BaseReporter
 
diff --git a/pylint/pyreverse/printer.py b/pylint/pyreverse/printer.py
index 1c31a5ef02..5ab76bcf08 100644
--- a/pylint/pyreverse/printer.py
+++ b/pylint/pyreverse/printer.py
@@ -8,8 +8,7 @@
 
 from abc import ABC, abstractmethod
 from enum import Enum
-from typing import NamedTuple
-from typing import TYPE_CHECKING
+from typing import TYPE_CHECKING, NamedTuple
 
 from pylint.pyreverse.utils import get_annotation_label
 
diff --git a/pylint/reporters/multi_reporter.py b/pylint/reporters/multi_reporter.py
index 9d8b44d887..6f010414a5 100644
--- a/pylint/reporters/multi_reporter.py
+++ b/pylint/reporters/multi_reporter.py
@@ -14,8 +14,8 @@
 
     from pylint.lint import PyLinter
     from pylint.message import Message
-    from pylint.reporters.ureports.nodes import Section
     from pylint.reporters.base_reporter import BaseReporter
+    from pylint.reporters.ureports.nodes import Section
     from pylint.utils import LinterStats
 
 
diff --git a/pylint/testutils/_primer/primer_command.py b/pylint/testutils/_primer/primer_command.py
index adf434a7dc..8e51dc05b9 100644
--- a/pylint/testutils/_primer/primer_command.py
+++ b/pylint/testutils/_primer/primer_command.py
@@ -5,7 +5,7 @@
 from __future__ import annotations
 
 import abc
-from typing import TypedDict, TYPE_CHECKING
+from typing import TYPE_CHECKING, TypedDict
 
 if TYPE_CHECKING:
     import argparse
diff --git a/pylint/testutils/_primer/primer_compare_command.py b/pylint/testutils/_primer/primer_compare_command.py
index c36384b631..1ec02adac1 100644
--- a/pylint/testutils/_primer/primer_compare_command.py
+++ b/pylint/testutils/_primer/primer_compare_command.py
@@ -7,13 +7,11 @@
 from pathlib import PurePosixPath
 from typing import TYPE_CHECKING
 
-from pylint.testutils._primer.primer_command import (
-    PackageData,
-    PrimerCommand,
-)
+from pylint.testutils._primer.primer_command import PackageData, PrimerCommand
 
 if TYPE_CHECKING:
     from pathlib import Path
+
     from pylint.reporters.json_reporter import OldJsonExport
     from pylint.testutils._primer.primer_command import PackageMessages
 
diff --git a/pylint/testutils/_primer/primer_run_command.py b/pylint/testutils/_primer/primer_run_command.py
index 8efbd738d0..27ac98d77d 100644
--- a/pylint/testutils/_primer/primer_run_command.py
+++ b/pylint/testutils/_primer/primer_run_command.py
@@ -14,10 +14,7 @@
 
 from pylint.lint import Run
 from pylint.reporters.json_reporter import JSONReporter
-from pylint.testutils._primer.primer_command import (
-    PackageData,
-    PrimerCommand,
-)
+from pylint.testutils._primer.primer_command import PackageData, PrimerCommand
 
 if TYPE_CHECKING:
     from pylint.message import Message
diff --git a/pylint/testutils/functional/test_file.py b/pylint/testutils/functional/test_file.py
index 223c890230..13831eeedf 100644
--- a/pylint/testutils/functional/test_file.py
+++ b/pylint/testutils/functional/test_file.py
@@ -6,7 +6,7 @@
 
 import configparser
 from os.path import basename, exists, join
-from typing import TypedDict, TYPE_CHECKING
+from typing import TYPE_CHECKING, TypedDict
 
 if TYPE_CHECKING:
     from collections.abc import Callable
diff --git a/pylint/testutils/lint_module_test.py b/pylint/testutils/lint_module_test.py
index efd676bf55..7a06e8dd21 100644
--- a/pylint/testutils/lint_module_test.py
+++ b/pylint/testutils/lint_module_test.py
@@ -21,10 +21,7 @@
 from pylint.testutils.constants import _EXPECTED_RE, _OPERATORS, UPDATE_OPTION
 
 # need to import from functional.test_file to avoid cyclic import
-from pylint.testutils.functional.test_file import (
-    NoFileError,
-    parse_python_version,
-)
+from pylint.testutils.functional.test_file import NoFileError, parse_python_version
 from pylint.testutils.output_line import OutputLine
 from pylint.testutils.reporter_for_tests import FunctionalTestReporter
 
diff --git a/pylint/utils/linterstats.py b/pylint/utils/linterstats.py
index 97b0869a5e..1ea4ddd7f6 100644
--- a/pylint/utils/linterstats.py
+++ b/pylint/utils/linterstats.py
@@ -4,7 +4,7 @@
 
 from __future__ import annotations
 
-from typing import Literal, TypedDict, cast, TYPE_CHECKING
+from typing import TYPE_CHECKING, Literal, TypedDict, cast
 
 if TYPE_CHECKING:
     from pylint.typing import MessageTypesFullName
diff --git a/pylint/utils/pragma_parser.py b/pylint/utils/pragma_parser.py
index aa6fc3448e..e7df4b57b6 100644
--- a/pylint/utils/pragma_parser.py
+++ b/pylint/utils/pragma_parser.py
@@ -5,7 +5,7 @@
 from __future__ import annotations
 
 import re
-from typing import NamedTuple, TYPE_CHECKING
+from typing import TYPE_CHECKING, NamedTuple
 
 if TYPE_CHECKING:
     from collections.abc import Generator

From 8d455abd0617a2666560bf3ed0c062cacc9654d4 Mon Sep 17 00:00:00 2001
From: Nick Drozd <nicholasdrozd@gmail.com>
Date: Wed, 25 Sep 2024 17:45:35 -0400
Subject: [PATCH 3/3] Revert one change

---
 pylint/testutils/_primer/primer.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pylint/testutils/_primer/primer.py b/pylint/testutils/_primer/primer.py
index 28089cfdeb..425c213eb4 100644
--- a/pylint/testutils/_primer/primer.py
+++ b/pylint/testutils/_primer/primer.py
@@ -9,6 +9,7 @@
 import sys
 from typing import TYPE_CHECKING
 
+from pylint.testutils._primer import PackageToLint
 from pylint.testutils._primer.primer_compare_command import CompareCommand
 from pylint.testutils._primer.primer_prepare_command import PrepareCommand
 from pylint.testutils._primer.primer_run_command import RunCommand
@@ -16,7 +17,6 @@
 if TYPE_CHECKING:
     from pathlib import Path
 
-    from pylint.testutils._primer import PackageToLint
     from pylint.testutils._primer.primer_command import PrimerCommand