diff options
author | Daniƫl van Noord <13665637+DanielNoord@users.noreply.github.com> | 2022-04-14 11:07:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-14 11:07:21 +0200 |
commit | 47e168cf607e2069b103fc466edfe1c6522e2fb2 (patch) | |
tree | 97d7b67b673d1147f4b8c9321b6247c117195060 | |
parent | 99ef057978e2ddd332bdd436fd5fd884deebdc53 (diff) | |
download | pylint-git-47e168cf607e2069b103fc466edfe1c6522e2fb2.tar.gz |
Use ``python-typing-update`` on ``pylint/extensions`` directory (#6308)
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)) |