Beispiel #1
0
 def visit_unaryop(self, node: nodes.UnaryOp) -> None:
     """`not len(S)` must become `not S` regardless if the parent block
     is a test condition or something else (boolean expression)
     e.g. `if not len(S):`"""
     if (isinstance(node, nodes.UnaryOp) and node.op == "not"
             and utils.is_call_of_name(node.operand, "len")):
         self.add_message("len-as-condition", node=node)
Beispiel #2
0
 def visit_call(self, node):
     # a len(S) call is used inside a test condition
     # could be if, while, assert or if expression statement
     # e.g. `if len(S):`
     if not utils.is_call_of_name(node, "len"):
         return
     # the len() call could also be nested together with other
     # boolean operations, e.g. `if z or len(x):`
     parent = node.parent
     while isinstance(parent, astroid.BoolOp):
         parent = parent.parent
     # we're finally out of any nested boolean operations so check if
     # this len() call is part of a test condition
     if not utils.is_test_condition(node, parent):
         return
     len_arg = node.args[0]
     generator_or_comprehension = (ListComp, SetComp, DictComp, GeneratorExp)
     if isinstance(len_arg, generator_or_comprehension):
         # The node is a generator or comprehension as in len([x for x in ...])
         self.add_message("len-as-condition", node=node)
         return
     instance = next(len_arg.infer())
     mother_classes = self.base_classes_of_node(instance)
     affected_by_pep8 = any(
         t in mother_classes for t in ["str", "tuple", "list", "set"]
     )
     if "range" in mother_classes or (
         affected_by_pep8 and not self.instance_has_bool(instance)
     ):
         self.add_message("len-as-condition", node=node)
Beispiel #3
0
    def visit_call(self, node):
        # a len(S) call is used inside a test condition
        # could be if, while, assert or if expression statement
        # e.g. `if len(S):`
        if utils.is_call_of_name(node, "len"):
            # the len() call could also be nested together with other
            # boolean operations, e.g. `if z or len(x):`
            parent = node.parent
            while isinstance(parent, astroid.BoolOp):
                parent = parent.parent

            # we're finally out of any nested boolean operations so check if
            # this len() call is part of a test condition
            if utils.is_test_condition(node, parent):
                self.add_message("len-as-condition", node=node)
Beispiel #4
0
 def visit_call(self, node: nodes.Call) -> None:
     # a len(S) call is used inside a test condition
     # could be if, while, assert or if expression statement
     # e.g. `if len(S):`
     if not utils.is_call_of_name(node, "len"):
         return
     # the len() call could also be nested together with other
     # boolean operations, e.g. `if z or len(x):`
     parent = node.parent
     while isinstance(parent, nodes.BoolOp):
         parent = parent.parent
     # we're finally out of any nested boolean operations so check if
     # this len() call is part of a test condition
     if not utils.is_test_condition(node, parent):
         return
     len_arg = node.args[0]
     generator_or_comprehension = (
         nodes.ListComp,
         nodes.SetComp,
         nodes.DictComp,
         nodes.GeneratorExp,
     )
     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)
         return
     try:
         instance = next(len_arg.infer())
     except astroid.InferenceError:
         # Probably undefined-variable, abort check
         return
     mother_classes = self.base_classes_of_node(instance)
     affected_by_pep8 = any(
         t in mother_classes for t in ("str", "tuple", "list", "set")
     )
     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)