diff options
Diffstat (limited to 'pylint/checkers/refactoring')
-rw-r--r-- | pylint/checkers/refactoring/implicit_booleaness_checker.py | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/pylint/checkers/refactoring/implicit_booleaness_checker.py b/pylint/checkers/refactoring/implicit_booleaness_checker.py index 13172a97e..20d8e0c30 100644 --- a/pylint/checkers/refactoring/implicit_booleaness_checker.py +++ b/pylint/checkers/refactoring/implicit_booleaness_checker.py @@ -9,6 +9,7 @@ from astroid import bases, nodes from pylint import checkers from pylint.checkers import utils +from pylint.interfaces import HIGH, INFERENCE class ImplicitBooleanessChecker(checkers.BaseChecker): @@ -99,7 +100,11 @@ class ImplicitBooleanessChecker(checkers.BaseChecker): ) if isinstance(len_arg, generator_or_comprehension): # The node is a generator or comprehension as in len([x for x in ...]) - self.add_message("use-implicit-booleaness-not-len", node=node) + self.add_message( + "use-implicit-booleaness-not-len", + node=node, + confidence=HIGH, + ) return try: instance = next(len_arg.infer()) @@ -113,7 +118,11 @@ class ImplicitBooleanessChecker(checkers.BaseChecker): if "range" in mother_classes or ( affected_by_pep8 and not self.instance_has_bool(instance) ): - self.add_message("use-implicit-booleaness-not-len", node=node) + self.add_message( + "use-implicit-booleaness-not-len", + node=node, + confidence=INFERENCE, + ) @staticmethod def instance_has_bool(class_def: nodes.ClassDef) -> bool: @@ -134,7 +143,9 @@ class ImplicitBooleanessChecker(checkers.BaseChecker): and node.op == "not" and utils.is_call_of_name(node.operand, "len") ): - self.add_message("use-implicit-booleaness-not-len", node=node) + self.add_message( + "use-implicit-booleaness-not-len", node=node, confidence=HIGH + ) @utils.only_required_for_messages("use-implicit-booleaness-not-comparison") def visit_compare(self, node: nodes.Compare) -> None: @@ -177,35 +188,33 @@ class ImplicitBooleanessChecker(checkers.BaseChecker): # No need to check for operator when visiting compare node if operator in {"==", "!=", ">=", ">", "<=", "<"}: - collection_literal = "{}" - if isinstance(literal_node, nodes.List): - collection_literal = "[]" - if isinstance(literal_node, nodes.Tuple): - collection_literal = "()" - - instance_name = "x" - if isinstance(target_node, nodes.Call) and target_node.func: - instance_name = f"{target_node.func.as_string()}(...)" - elif isinstance(target_node, (nodes.Attribute, nodes.Name)): - instance_name = target_node.as_string() - - original_comparison = ( - f"{instance_name} {operator} {collection_literal}" - ) - suggestion = ( - f"{instance_name}" - if operator == "!=" - else f"not {instance_name}" - ) self.add_message( "use-implicit-booleaness-not-comparison", - args=( - original_comparison, - suggestion, + args=self._implicit_booleaness_message_args( + literal_node, operator, target_node ), node=node, + confidence=HIGH, ) + def _implicit_booleaness_message_args( + self, literal_node: nodes.NodeNG, operator: str, target_node: nodes.NodeNG + ) -> tuple[str, str]: + """Helper to get the right message for "use-implicit-booleaness-not-comparison".""" + collection_literal = "{}" + if isinstance(literal_node, nodes.List): + collection_literal = "[]" + if isinstance(literal_node, nodes.Tuple): + collection_literal = "()" + instance_name = "x" + if isinstance(target_node, nodes.Call) and target_node.func: + instance_name = f"{target_node.func.as_string()}(...)" + elif isinstance(target_node, (nodes.Attribute, nodes.Name)): + instance_name = target_node.as_string() + original_comparison = f"{instance_name} {operator} {collection_literal}" + suggestion = f"{instance_name}" if operator == "!=" else f"not {instance_name}" + return original_comparison, suggestion + @staticmethod def base_names_of_instance(node: bases.Uninferable | bases.Instance) -> list[str]: """Return all names inherited by a class instance or those returned by a |