summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2022-04-14 11:07:21 +0200
committerGitHub <noreply@github.com>2022-04-14 11:07:21 +0200
commit47e168cf607e2069b103fc466edfe1c6522e2fb2 (patch)
tree97d7b67b673d1147f4b8c9321b6247c117195060
parent99ef057978e2ddd332bdd436fd5fd884deebdc53 (diff)
downloadpylint-git-47e168cf607e2069b103fc466edfe1c6522e2fb2.tar.gz
Use ``python-typing-update`` on ``pylint/extensions`` directory (#6308)
-rw-r--r--pylint/extensions/__init__.py4
-rw-r--r--pylint/extensions/_check_docs_utils.py15
-rw-r--r--pylint/extensions/bad_builtin.py5
-rw-r--r--pylint/extensions/broad_try_clause.py9
-rw-r--r--pylint/extensions/check_elif.py4
-rw-r--r--pylint/extensions/code_style.py22
-rw-r--r--pylint/extensions/comparetozero.py4
-rw-r--r--pylint/extensions/comparison_placement.py3
-rw-r--r--pylint/extensions/confusing_elif.py4
-rw-r--r--pylint/extensions/consider_ternary_expression.py4
-rw-r--r--pylint/extensions/docparams.py23
-rw-r--r--pylint/extensions/docstyle.py4
-rw-r--r--pylint/extensions/empty_comment.py4
-rw-r--r--pylint/extensions/emptystring.py4
-rw-r--r--pylint/extensions/for_any_all.py5
-rw-r--r--pylint/extensions/mccabe.py4
-rw-r--r--pylint/extensions/overlapping_exceptions.py8
-rw-r--r--pylint/extensions/private_import.py29
-rw-r--r--pylint/extensions/redefined_variable_type.py8
-rw-r--r--pylint/extensions/set_membership.py6
-rw-r--r--pylint/extensions/typing.py28
-rw-r--r--pylint/extensions/while_used.py5
22 files changed, 125 insertions, 77 deletions
diff --git a/pylint/extensions/__init__.py b/pylint/extensions/__init__.py
index 393fe5e9e..01b978e4b 100644
--- a/pylint/extensions/__init__.py
+++ b/pylint/extensions/__init__.py
@@ -2,6 +2,8 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from pylint.utils import register_plugins
@@ -10,7 +12,7 @@ if TYPE_CHECKING:
from pylint.lint import PyLinter
-def initialize(linter: "PyLinter") -> None:
+def initialize(linter: PyLinter) -> None:
"""Initialize linter with checkers in the extensions' directory."""
register_plugins(linter, __path__[0])
diff --git a/pylint/extensions/_check_docs_utils.py b/pylint/extensions/_check_docs_utils.py
index 0e2774bda..3c44df130 100644
--- a/pylint/extensions/_check_docs_utils.py
+++ b/pylint/extensions/_check_docs_utils.py
@@ -4,8 +4,9 @@
"""Utility methods for docstring checking."""
+from __future__ import annotations
+
import re
-from typing import List, Optional, Set, Tuple
import astroid
from astroid import nodes
@@ -95,12 +96,12 @@ def _get_raise_target(node):
return None
-def _split_multiple_exc_types(target: str) -> List[str]:
+def _split_multiple_exc_types(target: str) -> list[str]:
delimiters = r"(\s*,(?:\s*or\s)?\s*|\s+or\s+)"
return re.split(delimiters, target)
-def possible_exc_types(node: nodes.NodeNG) -> Set[nodes.ClassDef]:
+def possible_exc_types(node: nodes.NodeNG) -> set[nodes.ClassDef]:
"""Gets all the possible raised exception types for the given raise node.
.. note::
@@ -157,8 +158,8 @@ def possible_exc_types(node: nodes.NodeNG) -> Set[nodes.ClassDef]:
def docstringify(
- docstring: Optional[nodes.Const], default_type: str = "default"
-) -> "Docstring":
+ docstring: nodes.Const | None, default_type: str = "default"
+) -> Docstring:
best_match = (0, DOCSTRING_TYPES.get(default_type, Docstring)(docstring))
for docstring_type in (
SphinxDocstring,
@@ -190,7 +191,7 @@ class Docstring:
# These methods are designed to be overridden
# pylint: disable=no-self-use
- def __init__(self, doc: Optional[nodes.Const]) -> None:
+ def __init__(self, doc: nodes.Const | None) -> None:
docstring = doc.value if doc else ""
self.doc = docstring.expandtabs()
@@ -768,7 +769,7 @@ class NumpyDocstring(GoogleDocstring):
supports_yields = True
- def match_param_docs(self) -> Tuple[Set[str], Set[str]]:
+ def match_param_docs(self) -> tuple[set[str], set[str]]:
"""Matches parameter documentation section to parameter documentation rules."""
params_with_doc = set()
params_with_type = set()
diff --git a/pylint/extensions/bad_builtin.py b/pylint/extensions/bad_builtin.py
index 816460756..980a93357 100644
--- a/pylint/extensions/bad_builtin.py
+++ b/pylint/extensions/bad_builtin.py
@@ -3,6 +3,9 @@
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
"""Checker for deprecated builtins."""
+
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -61,5 +64,5 @@ class BadBuiltinChecker(BaseChecker):
self.add_message("bad-builtin", node=node, args=args)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(BadBuiltinChecker(linter))
diff --git a/pylint/extensions/broad_try_clause.py b/pylint/extensions/broad_try_clause.py
index 7bd5b4f82..b60b3932a 100644
--- a/pylint/extensions/broad_try_clause.py
+++ b/pylint/extensions/broad_try_clause.py
@@ -3,7 +3,10 @@
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
"""Looks for try/except statements with too much code in the try clause."""
-from typing import TYPE_CHECKING, Union
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
from astroid import nodes
@@ -55,7 +58,7 @@ class BroadTryClauseChecker(checkers.BaseChecker):
return statement_count
- def visit_tryexcept(self, node: Union[nodes.TryExcept, nodes.TryFinally]) -> None:
+ def visit_tryexcept(self, node: nodes.TryExcept | nodes.TryFinally) -> None:
try_clause_statements = self._count_statements(node)
if try_clause_statements > self.linter.namespace.max_try_statements:
msg = f"try clause contains {try_clause_statements} statements, expected at most {self.linter.namespace.max_try_statements}"
@@ -67,5 +70,5 @@ class BroadTryClauseChecker(checkers.BaseChecker):
self.visit_tryexcept(node)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(BroadTryClauseChecker(linter))
diff --git a/pylint/extensions/check_elif.py b/pylint/extensions/check_elif.py
index 6ffc32009..874220459 100644
--- a/pylint/extensions/check_elif.py
+++ b/pylint/extensions/check_elif.py
@@ -2,6 +2,8 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -57,5 +59,5 @@ class ElseifUsedChecker(BaseTokenChecker):
self.add_message("else-if-used", node=node, confidence=HIGH)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(ElseifUsedChecker(linter))
diff --git a/pylint/extensions/code_style.py b/pylint/extensions/code_style.py
index 7c254ecd3..ba9e9d3d2 100644
--- a/pylint/extensions/code_style.py
+++ b/pylint/extensions/code_style.py
@@ -2,8 +2,10 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
+from __future__ import annotations
+
import sys
-from typing import TYPE_CHECKING, List, Optional, Set, Tuple, Type, Union, cast
+from typing import TYPE_CHECKING, Tuple, Type, Union, cast
from astroid import nodes
@@ -125,7 +127,7 @@ class CodeStyleChecker(BaseChecker):
KeyTupleT = Tuple[Type[nodes.NodeNG], str]
# Makes sure all keys are 'Const' string nodes
- keys_checked: Set[KeyTupleT] = set()
+ keys_checked: set[KeyTupleT] = set()
for _, dict_value in node.items:
dict_value = cast(nodes.Dict, dict_value)
for key, _ in dict_value.items:
@@ -141,13 +143,13 @@ class CodeStyleChecker(BaseChecker):
keys_checked.add(key_tuple)
# Makes sure all subdicts have at least 1 common key
- key_tuples: List[Tuple[KeyTupleT, ...]] = []
+ key_tuples: list[tuple[KeyTupleT, ...]] = []
for _, dict_value in node.items:
dict_value = cast(nodes.Dict, dict_value)
key_tuples.append(
tuple((type(key), key.as_string()) for key, _ in dict_value.items)
)
- keys_intersection: Set[KeyTupleT] = set(key_tuples[0])
+ keys_intersection: set[KeyTupleT] = set(key_tuples[0])
for sub_key_tuples in key_tuples[1:]:
keys_intersection.intersection_update(sub_key_tuples)
if not keys_intersection:
@@ -194,7 +196,7 @@ class CodeStyleChecker(BaseChecker):
Note: Assignment expressions were added in Python 3.8
"""
# Check if `node.test` contains a `Name` node
- node_name: Optional[nodes.Name] = None
+ node_name: nodes.Name | None = None
if isinstance(node.test, nodes.Name):
node_name = node.test
elif (
@@ -249,8 +251,8 @@ class CodeStyleChecker(BaseChecker):
@staticmethod
def _check_prev_sibling_to_if_stmt(
- prev_sibling: Optional[nodes.NodeNG], name: Optional[str]
- ) -> TypeGuard[Union[nodes.Assign, nodes.AnnAssign]]:
+ prev_sibling: nodes.NodeNG | None, name: str | None
+ ) -> TypeGuard[nodes.Assign | nodes.AnnAssign]:
"""Check if previous sibling is an assignment with the same name.
Ignore statements which span multiple lines.
@@ -275,7 +277,7 @@ class CodeStyleChecker(BaseChecker):
@staticmethod
def _check_ignore_assignment_expr_suggestion(
- node: nodes.If, name: Optional[str]
+ node: nodes.If, name: str | None
) -> bool:
"""Return True if suggestion for assignment expr should be ignored.
@@ -283,7 +285,7 @@ class CodeStyleChecker(BaseChecker):
(multiple conditions).
"""
if isinstance(node.test, nodes.Compare):
- next_if_node: Optional[nodes.If] = None
+ next_if_node: nodes.If | None = None
next_sibling = node.next_sibling()
if len(node.orelse) == 1 and isinstance(node.orelse[0], nodes.If):
# elif block
@@ -306,5 +308,5 @@ class CodeStyleChecker(BaseChecker):
return False
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(CodeStyleChecker(linter))
diff --git a/pylint/extensions/comparetozero.py b/pylint/extensions/comparetozero.py
index 711744d1f..1786b3d2c 100644
--- a/pylint/extensions/comparetozero.py
+++ b/pylint/extensions/comparetozero.py
@@ -4,6 +4,8 @@
"""Looks for comparisons to zero."""
+from __future__ import annotations
+
import itertools
from typing import TYPE_CHECKING, Any, Iterable
@@ -72,5 +74,5 @@ class CompareToZeroChecker(checkers.BaseChecker):
self.add_message("compare-to-zero", node=node)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(CompareToZeroChecker(linter))
diff --git a/pylint/extensions/comparison_placement.py b/pylint/extensions/comparison_placement.py
index 8156f98b3..df2a9642d 100644
--- a/pylint/extensions/comparison_placement.py
+++ b/pylint/extensions/comparison_placement.py
@@ -6,6 +6,7 @@
See https://en.wikipedia.org/wiki/Yoda_conditions
"""
+from __future__ import annotations
from typing import TYPE_CHECKING
@@ -67,5 +68,5 @@ class MisplacedComparisonConstantChecker(BaseChecker):
self._check_misplaced_constant(node, left, right, operator)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(MisplacedComparisonConstantChecker(linter))
diff --git a/pylint/extensions/confusing_elif.py b/pylint/extensions/confusing_elif.py
index e44472b88..133804996 100644
--- a/pylint/extensions/confusing_elif.py
+++ b/pylint/extensions/confusing_elif.py
@@ -2,6 +2,8 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -48,5 +50,5 @@ class ConfusingConsecutiveElifChecker(BaseChecker):
return False
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(ConfusingConsecutiveElifChecker(linter))
diff --git a/pylint/extensions/consider_ternary_expression.py b/pylint/extensions/consider_ternary_expression.py
index aece514b7..77070d848 100644
--- a/pylint/extensions/consider_ternary_expression.py
+++ b/pylint/extensions/consider_ternary_expression.py
@@ -4,6 +4,8 @@
"""Check for if / assign blocks that can be rewritten with if-expressions."""
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -53,5 +55,5 @@ class ConsiderTernaryExpressionChecker(BaseChecker):
self.add_message("consider-ternary-expression", node=node)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(ConsiderTernaryExpressionChecker(linter))
diff --git a/pylint/extensions/docparams.py b/pylint/extensions/docparams.py
index 2a9fa13f4..88f17253b 100644
--- a/pylint/extensions/docparams.py
+++ b/pylint/extensions/docparams.py
@@ -3,8 +3,11 @@
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
"""Pylint plugin for checking in Sphinx, Google, or Numpy style docstrings."""
+
+from __future__ import annotations
+
import re
-from typing import TYPE_CHECKING, Optional, Set
+from typing import TYPE_CHECKING
import astroid
from astroid import nodes
@@ -366,10 +369,10 @@ class DocstringParameterChecker(BaseChecker):
def _compare_missing_args(
self,
- found_argument_names: Set[str],
+ found_argument_names: set[str],
message_id: str,
- not_needed_names: Set[str],
- expected_argument_names: Set[str],
+ not_needed_names: set[str],
+ expected_argument_names: set[str],
warning_node: nodes.NodeNG,
) -> None:
"""Compare the found argument names with the expected ones and
@@ -405,10 +408,10 @@ class DocstringParameterChecker(BaseChecker):
def _compare_different_args(
self,
- found_argument_names: Set[str],
+ found_argument_names: set[str],
message_id: str,
- not_needed_names: Set[str],
- expected_argument_names: Set[str],
+ not_needed_names: set[str],
+ expected_argument_names: set[str],
warning_node: nodes.NodeNG,
) -> None:
"""Compare the found argument names with the expected ones and
@@ -425,7 +428,7 @@ class DocstringParameterChecker(BaseChecker):
:param warning_node: The node to be analyzed
"""
# Handle variadic and keyword args without asterisks
- modified_expected_argument_names: Set[str] = set()
+ modified_expected_argument_names: set[str] = set()
for name in expected_argument_names:
if name.replace("*", "") in found_argument_names:
modified_expected_argument_names.add(name.replace("*", ""))
@@ -481,7 +484,7 @@ class DocstringParameterChecker(BaseChecker):
doc: Docstring,
arguments_node: astroid.Arguments,
warning_node: astroid.NodeNG,
- accept_no_param_doc: Optional[bool] = None,
+ accept_no_param_doc: bool | None = None,
):
"""Check that all parameters are consistent with the parameters mentioned
in the parameter documentation (e.g. the Sphinx tags 'param' and 'type').
@@ -652,5 +655,5 @@ class DocstringParameterChecker(BaseChecker):
)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(DocstringParameterChecker(linter))
diff --git a/pylint/extensions/docstyle.py b/pylint/extensions/docstyle.py
index 960c48a71..457903bb1 100644
--- a/pylint/extensions/docstyle.py
+++ b/pylint/extensions/docstyle.py
@@ -2,6 +2,8 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
+from __future__ import annotations
+
import linecache
from typing import TYPE_CHECKING
@@ -82,5 +84,5 @@ class DocStringStyleChecker(checkers.BaseChecker):
)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(DocStringStyleChecker(linter))
diff --git a/pylint/extensions/empty_comment.py b/pylint/extensions/empty_comment.py
index 8ad8c390f..7aacc430e 100644
--- a/pylint/extensions/empty_comment.py
+++ b/pylint/extensions/empty_comment.py
@@ -2,6 +2,8 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -62,5 +64,5 @@ class CommentChecker(BaseChecker):
self.add_message("empty-comment", line=line_num + 1)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(CommentChecker(linter))
diff --git a/pylint/extensions/emptystring.py b/pylint/extensions/emptystring.py
index fb1662ef9..7056d1d69 100644
--- a/pylint/extensions/emptystring.py
+++ b/pylint/extensions/emptystring.py
@@ -4,6 +4,8 @@
"""Looks for comparisons to empty string."""
+from __future__ import annotations
+
import itertools
from typing import TYPE_CHECKING, Any, Iterable
@@ -67,5 +69,5 @@ class CompareToEmptyStringChecker(checkers.BaseChecker):
self.add_message("compare-to-empty-string", node=node)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(CompareToEmptyStringChecker(linter))
diff --git a/pylint/extensions/for_any_all.py b/pylint/extensions/for_any_all.py
index 078c20402..ed57d3955 100644
--- a/pylint/extensions/for_any_all.py
+++ b/pylint/extensions/for_any_all.py
@@ -3,6 +3,9 @@
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
"""Check for use of for loops that only check for a condition."""
+
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -69,5 +72,5 @@ class ConsiderUsingAnyOrAllChecker(BaseChecker):
return f"{suggested_function}({test} for {loop_var} in {loop_iter})"
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(ConsiderUsingAnyOrAllChecker(linter))
diff --git a/pylint/extensions/mccabe.py b/pylint/extensions/mccabe.py
index 568de796d..3a2f7bf52 100644
--- a/pylint/extensions/mccabe.py
+++ b/pylint/extensions/mccabe.py
@@ -4,6 +4,8 @@
"""Module to add McCabe checker class for pylint."""
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -191,5 +193,5 @@ class McCabeMethodChecker(checkers.BaseChecker):
)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(McCabeMethodChecker(linter))
diff --git a/pylint/extensions/overlapping_exceptions.py b/pylint/extensions/overlapping_exceptions.py
index e610523ac..97fddaec4 100644
--- a/pylint/extensions/overlapping_exceptions.py
+++ b/pylint/extensions/overlapping_exceptions.py
@@ -4,7 +4,9 @@
"""Looks for overlapping exceptions."""
-from typing import TYPE_CHECKING, Any, List, Tuple
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
import astroid
from astroid import nodes
@@ -49,7 +51,7 @@ class OverlappingExceptionsChecker(checkers.BaseChecker):
except astroid.InferenceError:
continue
- handled_in_clause: List[Tuple[Any, Any]] = []
+ handled_in_clause: list[tuple[Any, Any]] = []
for part, exc in excs:
if exc is astroid.Uninferable:
continue
@@ -86,5 +88,5 @@ class OverlappingExceptionsChecker(checkers.BaseChecker):
handled_in_clause += [(part, exc)]
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(OverlappingExceptionsChecker(linter))
diff --git a/pylint/extensions/private_import.py b/pylint/extensions/private_import.py
index 8d57eca83..6ab17e574 100644
--- a/pylint/extensions/private_import.py
+++ b/pylint/extensions/private_import.py
@@ -3,8 +3,11 @@
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
"""Check for imports on private external modules and names."""
+
+from __future__ import annotations
+
from pathlib import Path
-from typing import TYPE_CHECKING, Dict, List, Union
+from typing import TYPE_CHECKING
from astroid import nodes
@@ -29,11 +32,11 @@ class PrivateImportChecker(BaseChecker):
),
}
- def __init__(self, linter: "PyLinter") -> None:
+ def __init__(self, linter: PyLinter) -> None:
BaseChecker.__init__(self, linter)
# A mapping of private names used as a type annotation to whether it is an acceptable import
- self.all_used_type_annotations: Dict[str, bool] = {}
+ self.all_used_type_annotations: dict[str, bool] = {}
self.populated_annotations = False
@utils.check_messages("import-private-name")
@@ -94,7 +97,7 @@ class PrivateImportChecker(BaseChecker):
confidence=HIGH,
)
- def _get_private_imports(self, names: List[str]) -> List[str]:
+ def _get_private_imports(self, names: list[str]) -> list[str]:
"""Returns the private names from input names by a simple string check."""
return [name for name in names if self._name_is_private(name)]
@@ -110,8 +113,8 @@ class PrivateImportChecker(BaseChecker):
)
def _get_type_annotation_names(
- self, node: nodes.Import, names: List[str]
- ) -> List[str]:
+ self, node: nodes.Import, names: list[str]
+ ) -> list[str]:
"""Removes from names any names that are used as type annotations with no other illegal usages."""
if names and not self.populated_annotations:
self._populate_type_annotations(node.root(), self.all_used_type_annotations)
@@ -128,7 +131,7 @@ class PrivateImportChecker(BaseChecker):
]
def _populate_type_annotations(
- self, node: nodes.LocalsDictNodeNG, all_used_type_annotations: Dict[str, bool]
+ self, node: nodes.LocalsDictNodeNG, all_used_type_annotations: dict[str, bool]
) -> None:
"""Adds into the dict `all_used_type_annotations` the names of all names ever used as a type annotation
in the scope and nested scopes of node and whether these names are only used for type checking.
@@ -166,7 +169,7 @@ class PrivateImportChecker(BaseChecker):
] = self._assignments_call_private_name(name_assignments, private_name)
def _populate_type_annotations_function(
- self, node: nodes.FunctionDef, all_used_type_annotations: Dict[str, bool]
+ self, node: nodes.FunctionDef, all_used_type_annotations: dict[str, bool]
) -> None:
"""Adds into the dict `all_used_type_annotations` the names of all names used as a type annotation
in the arguments and return type of the function node.
@@ -183,9 +186,9 @@ class PrivateImportChecker(BaseChecker):
def _populate_type_annotations_annotation(
self,
- node: Union[nodes.Attribute, nodes.Subscript, nodes.Name],
- all_used_type_annotations: Dict[str, bool],
- ) -> Union[str, None]:
+ node: nodes.Attribute | nodes.Subscript | nodes.Name,
+ all_used_type_annotations: dict[str, bool],
+ ) -> str | None:
"""Handles the possiblity of an annotation either being a Name, i.e. just type,
or a Subscript e.g. `Optional[type]` or an Attribute, e.g. `pylint.lint.linter`.
"""
@@ -210,7 +213,7 @@ class PrivateImportChecker(BaseChecker):
@staticmethod
def _assignments_call_private_name(
- assignments: List[Union[nodes.AnnAssign, nodes.Assign]], private_name: str
+ assignments: list[nodes.AnnAssign | nodes.Assign], private_name: str
) -> bool:
"""Returns True if no assignments involve accessing `private_name`."""
if all(not assignment.value for assignment in assignments):
@@ -248,5 +251,5 @@ class PrivateImportChecker(BaseChecker):
return base_import_package in Path(node.root().file).parent.parts
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(PrivateImportChecker(linter))
diff --git a/pylint/extensions/redefined_variable_type.py b/pylint/extensions/redefined_variable_type.py
index 41464630b..b3ce07e46 100644
--- a/pylint/extensions/redefined_variable_type.py
+++ b/pylint/extensions/redefined_variable_type.py
@@ -2,7 +2,9 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
-from typing import TYPE_CHECKING, List
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
from astroid import nodes
@@ -51,7 +53,7 @@ class MultipleTypesChecker(BaseChecker):
leave_functiondef = leave_module = leave_classdef
def visit_module(self, _: nodes.Module) -> None:
- self._assigns: List[dict] = [{}]
+ self._assigns: list[dict] = [{}]
def _check_and_add_messages(self):
assigns = self._assigns.pop()
@@ -105,5 +107,5 @@ class MultipleTypesChecker(BaseChecker):
)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(MultipleTypesChecker(linter))
diff --git a/pylint/extensions/set_membership.py b/pylint/extensions/set_membership.py
index 9d741681d..540467956 100644
--- a/pylint/extensions/set_membership.py
+++ b/pylint/extensions/set_membership.py
@@ -2,6 +2,8 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -28,7 +30,7 @@ class SetMembershipChecker(BaseChecker):
),
}
- def __init__(self, linter: "PyLinter") -> None:
+ def __init__(self, linter: PyLinter) -> None:
"""Initialize checker instance."""
super().__init__(linter=linter)
@@ -50,5 +52,5 @@ class SetMembershipChecker(BaseChecker):
self.add_message("use-set-for-membership", node=comparator)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(SetMembershipChecker(linter))
diff --git a/pylint/extensions/typing.py b/pylint/extensions/typing.py
index b29b58cf6..a41fc5a1e 100644
--- a/pylint/extensions/typing.py
+++ b/pylint/extensions/typing.py
@@ -2,7 +2,9 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
-from typing import TYPE_CHECKING, Dict, List, NamedTuple, Set, Union
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, NamedTuple
import astroid.bases
from astroid import nodes
@@ -27,7 +29,7 @@ class TypingAlias(NamedTuple):
name_collision: bool
-DEPRECATED_TYPING_ALIASES: Dict[str, TypingAlias] = {
+DEPRECATED_TYPING_ALIASES: dict[str, TypingAlias] = {
"typing.Tuple": TypingAlias("tuple", False),
"typing.List": TypingAlias("list", False),
"typing.Dict": TypingAlias("dict", False),
@@ -83,7 +85,7 @@ TYPING_NORETURN = frozenset(
class DeprecatedTypingAliasMsg(NamedTuple):
- node: Union[nodes.Name, nodes.Attribute]
+ node: nodes.Name | nodes.Attribute
qname: str
alias: str
parent_subscript: bool = False
@@ -161,13 +163,13 @@ class TypingChecker(BaseChecker):
or Python 3.7+ with postponed evaluation.
"""
- def __init__(self, linter: "PyLinter") -> None:
+ def __init__(self, linter: PyLinter) -> None:
"""Initialize checker instance."""
super().__init__(linter=linter)
self._found_broken_callable_location: bool = False
- self._alias_name_collisions: Set[str] = set()
- self._deprecated_typing_alias_msgs: List[DeprecatedTypingAliasMsg] = []
- self._consider_using_alias_msgs: List[DeprecatedTypingAliasMsg] = []
+ self._alias_name_collisions: set[str] = set()
+ self._deprecated_typing_alias_msgs: list[DeprecatedTypingAliasMsg] = []
+ self._consider_using_alias_msgs: list[DeprecatedTypingAliasMsg] = []
def open(self) -> None:
py_version = get_global_option(self, "py-version")
@@ -227,7 +229,7 @@ class TypingChecker(BaseChecker):
def _check_for_alternative_union_syntax(
self,
- node: Union[nodes.Name, nodes.Attribute],
+ node: nodes.Name | nodes.Attribute,
name: str,
) -> None:
"""Check if alternative union syntax could be used.
@@ -256,7 +258,7 @@ class TypingChecker(BaseChecker):
def _check_for_typing_alias(
self,
- node: Union[nodes.Name, nodes.Attribute],
+ node: nodes.Name | nodes.Attribute,
) -> None:
"""Check if typing alias is deprecated or could be replaced.
@@ -349,7 +351,7 @@ class TypingChecker(BaseChecker):
self._alias_name_collisions.clear()
self._consider_using_alias_msgs.clear()
- def _check_broken_noreturn(self, node: Union[nodes.Name, nodes.Attribute]) -> None:
+ def _check_broken_noreturn(self, node: nodes.Name | nodes.Attribute) -> None:
"""Check for 'NoReturn' inside compound types."""
if not isinstance(node.parent, nodes.BaseContainer):
# NoReturn not part of a Union or Callable type
@@ -375,7 +377,7 @@ class TypingChecker(BaseChecker):
self.add_message("broken-noreturn", node=node, confidence=INFERENCE)
break
- def _check_broken_callable(self, node: Union[nodes.Name, nodes.Attribute]) -> None:
+ def _check_broken_callable(self, node: nodes.Name | nodes.Attribute) -> None:
"""Check for 'collections.abc.Callable' inside Optional and Union."""
inferred = safe_infer(node)
if not (
@@ -388,7 +390,7 @@ class TypingChecker(BaseChecker):
self.add_message("broken-collections-callable", node=node, confidence=INFERENCE)
def _broken_callable_location( # pylint: disable=no-self-use
- self, node: Union[nodes.Name, nodes.Attribute]
+ self, node: nodes.Name | nodes.Attribute
) -> bool:
"""Check if node would be a broken location for collections.abc.Callable."""
if (
@@ -429,5 +431,5 @@ class TypingChecker(BaseChecker):
return True
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(TypingChecker(linter))
diff --git a/pylint/extensions/while_used.py b/pylint/extensions/while_used.py
index 4c41510d4..1be054810 100644
--- a/pylint/extensions/while_used.py
+++ b/pylint/extensions/while_used.py
@@ -3,6 +3,9 @@
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
"""Check for use of while loops."""
+
+from __future__ import annotations
+
from typing import TYPE_CHECKING
from astroid import nodes
@@ -32,5 +35,5 @@ class WhileChecker(BaseChecker):
self.add_message("while-used", node=node)
-def register(linter: "PyLinter") -> None:
+def register(linter: PyLinter) -> None:
linter.register_checker(WhileChecker(linter))