pylint/checkers/refactoring.py
def _check_chained_comparison(self, node):
        """Check if there is any chained comparison in the expression.

        Add a refactoring message if a boolOp contains comparison like a < b and b < c,
        which can be chained as a < b < c.

        Care is taken to avoid simplifying a < b < c and b < d.
        """
        if node.op != "and" or len(node.values) < 2:
            return

        def _find_lower_upper_bounds(comparison_node, uses):
            left_operand = comparison_node.left
            for operator, right_operand in comparison_node.ops:
                for operand in (left_operand, right_operand):
                    value = None
                    if isinstance(operand, astroid.Name):
                        value = operand.name
                    elif isinstance(operand, astroid.Const):
                        value = operand.value

                    if value is None:
                        continue

                    if operator in ("<", "<="):
                        if operand is left_operand:
                            uses[value]["lower_bound"].add(comparison_node)
                        elif operand is right_operand:
                            uses[value]["upper_bound"].add(comparison_node)
                    elif operator in (">", ">="):
                        if operand is left_operand:
                            uses[value]["upper_bound"].add(comparison_node)
                        elif operand is right_operand:
                            uses[value]["lower_bound"].add(comparison_node)
                left_operand = right_operand

        uses = collections.defaultdict(
            lambda: {"lower_bound": set(), "upper_bound": set()}
        )
        for comparison_node in node.values:
            if isinstance(comparison_node, astroid.Compare):
                _find_lower_upper_bounds(comparison_node, uses)

        for _, bounds in uses.items():
            num_shared = len(bounds["lower_bound"].intersection(bounds["upper_bound"]))
            num_lower_bounds = len(bounds["lower_bound"])
            num_upper_bounds = len(bounds["upper_bound"])
            if num_shared < num_lower_bounds and num_shared < num_upper_bounds:
                self.add_message("chained-comparison", node=node)
                break
def _check_chained_comparison(self, node):
        if node.op != "and" or len(node.values) < 2:
            return

        def _find_lower_upper_bounds(comparison_node, uses):
            left_operand = comparison_node.left
            for operator, right_operand in comparison_node.ops:
                for operand in (left_operand, right_operand):
                    value = None
                    if isinstance(operand, astroid.Name):
                        value = operand.name
                    elif isinstance(operand, astroid.Const):
                        value = operand.value

                    if value is None:
                        continue

                    if operator in ("<", "<="):
                        if operand is left_operand:
                            uses[value]["lower_bound"].add(comparison_node)
                        elif operand is right_operand:
                            uses[value]["upper_bound"].add(comparison_node)
                    elif operator in (">", ">="):
                        if operand is left_operand:
                            uses[value]["upper_bound"].add(comparison_node)
                        elif operand is right_operand:
                            uses[value]["lower_bound"].add(comparison_node)
                left_operand = right_operand

        uses = collections.defaultdict(
            lambda: {"lower_bound": set(), "upper_bound": set()}
        )
        for comparison_node in node.values:
            if isinstance(comparison_node, astroid.Compare):
                _find_lower_upper_bounds(comparison_node, uses)

        for _, bounds in uses.items():
            num_shared = len(bounds["lower_bound"].intersection(bounds["upper_bound"]))
            num_lower_bounds = len(bounds["lower_bound"])
            num_upper_bounds = len(bounds["upper_bound"])
            if num_shared < num_lower_bounds and num_shared < num_upper_bounds:
                self.add_message("chained-comparison", node=node)
                break
def _check_chained_comparison ( self , node ) : if node . op != "and" or len ( node . values ) < 2 : return def _find_lower_upper_bounds ( comparison_node , uses ) : left_operand = comparison_node . left for operator , right_operand in comparison_node . ops : for operand in ( left_operand , right_operand ) : value = None if isinstance ( operand , astroid . Name ) : value = operand . name elif isinstance ( operand , astroid . Const ) : value = operand . value if value is None : continue if operator in ( "<" , "<=" ) : if operand is left_operand : uses [ value ] [ "lower_bound" ] . add ( comparison_node ) elif operand is right_operand : uses [ value ] [ "upper_bound" ] . add ( comparison_node ) elif operator in ( ">" , ">=" ) : if operand is left_operand : uses [ value ] [ "upper_bound" ] . add ( comparison_node ) elif operand is right_operand : uses [ value ] [ "lower_bound" ] . add ( comparison_node ) left_operand = right_operand uses = collections . defaultdict ( lambda : { "lower_bound" : set ( ) , "upper_bound" : set ( ) } ) for comparison_node in node . values : if isinstance ( comparison_node , astroid . Compare ) : _find_lower_upper_bounds ( comparison_node , uses ) for _ , bounds in uses . items ( ) : num_shared = len ( bounds [ "lower_bound" ] . intersection ( bounds [ "upper_bound" ] ) ) num_lower_bounds = len ( bounds [ "lower_bound" ] ) num_upper_bounds = len ( bounds [ "upper_bound" ] ) if num_shared < num_lower_bounds and num_shared < num_upper_bounds : self . add_message ( "chained-comparison" , node = node ) break
Check if there is any chained comparison in the expression.

        Add a refactoring message if a boolOp contains comparison like a < b and b < c,
        which can be chained as a < b < c.

        Care is taken to avoid simplifying a < b < c and b < d.
Check if there is any chained comparison in the expression .