Beispiel #1
0
    def _check_slots(self, node):
        if '__slots__' not in node.locals:
            return
        for slots in node.igetattr('__slots__'):
            # check if __slots__ is a valid type
            if slots is astroid.YES:
                continue
            if not is_iterable(slots) and not is_comprehension(slots):
                self.add_message('invalid-slots', node=node)
                continue

            if isinstance(slots, astroid.Const):
                # a string, ignore the following checks
                continue
            if not hasattr(slots, 'itered'):
                # we can't obtain the values, maybe a .deque?
                continue

            if isinstance(slots, astroid.Dict):
                values = [item[0] for item in slots.items]
            else:
                values = slots.itered()
            if values is astroid.YES:
                return

            for elt in values:
                try:
                    self._check_slots_elt(elt)
                except astroid.InferenceError:
                    continue
Beispiel #2
0
    def _check_slots(self, node):
        if '__slots__' not in node.locals:
            return
        for slots in node.igetattr('__slots__'):
            # check if __slots__ is a valid type
            if slots is astroid.YES:
                continue
            if not is_iterable(slots) and not is_comprehension(slots):
                self.add_message('invalid-slots', node=node)
                continue

            if isinstance(slots, astroid.Const):
                # a string, ignore the following checks
                continue
            if not hasattr(slots, 'itered'):
                # we can't obtain the values, maybe a .deque?
                continue

            if isinstance(slots, astroid.Dict):
                values = [item[0] for item in slots.items]
            else:
                values = slots.itered()
            if values is astroid.YES:
                return

            for elt in values:
                try:
                    self._check_slots_elt(elt)
                except astroid.InferenceError:
                    continue
Beispiel #3
0
 def _check_membership_test(self, node):
     if is_inside_abstract_class(node):
         return
     if is_comprehension(node):
         return
     infered = safe_infer(node)
     if infered is None or infered is astroid.YES:
         return
     if not supports_membership_test(infered):
         self.add_message("unsupported-membership-test", args=node.as_string(), node=node)
Beispiel #4
0
 def _check_iterable(self, node):
     if is_inside_abstract_class(node):
         return
     if is_comprehension(node):
         return
     infered = safe_infer(node)
     if infered is None or infered is astroid.YES:
         return
     if not is_iterable(infered):
         self.add_message("not-an-iterable", args=node.as_string(), node=node)
Beispiel #5
0
 def _check_iterable(self, node):
     if is_inside_abstract_class(node):
         return
     if is_comprehension(node):
         return
     infered = safe_infer(node)
     if infered is None or infered is astroid.YES:
         return
     if not is_iterable(infered):
         self.add_message('not-an-iterable',
                          args=node.as_string(),
                          node=node)
Beispiel #6
0
 def _check_membership_test(self, node):
     if is_inside_abstract_class(node):
         return
     if is_comprehension(node):
         return
     infered = safe_infer(node)
     if infered is None or infered is astroid.YES:
         return
     if not supports_membership_test(infered):
         self.add_message('unsupported-membership-test',
                          args=node.as_string(),
                          node=node)
Beispiel #7
0
    def visit_call(self, node):
        inferred = utils.safe_infer(node.func)
        if not inferred:
            return

        if not isinstance(inferred, astroid.BoundMethod):
            return
        if not isinstance(inferred.bound, astroid.Dict) or inferred.name != 'keys':
            return

        # Check if the statement is what we're expecting to have.
        statement = node.statement()
        if isinstance(statement, astroid.Expr):
            statement = statement.value

        if isinstance(statement, astroid.For) or utils.is_comprehension(statement):
            self.add_message('consider-iterating-dictionary', node=node)
Beispiel #8
0
    def visit_call(self, node):
        inferred = utils.safe_infer(node.func)
        if not inferred:
            return

        if not isinstance(inferred, astroid.BoundMethod):
            return
        if not isinstance(inferred.bound, astroid.Dict) or inferred.name != 'keys':
            return

        # Check if the statement is what we're expecting to have.
        statement = node.statement()
        if isinstance(statement, astroid.Expr):
            statement = statement.value

        if isinstance(statement, astroid.For) or utils.is_comprehension(statement):
            self.add_message('consider-iterating-dictionary', node=node)