def _check_lambda_inside_loop( self, node: Union[AnyLoop, AnyComprehension], ) -> None: for lambda_node in walk.get_subnodes_by_type(node, ast.Lambda): arg_nodes = walk.get_subnodes_by_type(lambda_node, ast.arg) body_nodes = walk.get_subnodes_by_type(lambda_node.body, ast.Name) arguments = (arg.arg for arg in arg_nodes) body = (subnode.id for subnode in body_nodes) if not all(symbol in arguments for symbol in body): self.add_violation(LambdaInsideLoopViolation(node))
def _check_last_return_in_function(self, node: ast.Return) -> None: parent = get_parent(node) if not isinstance(parent, FunctionNodes): return returns = len(tuple(filter( lambda return_node: return_node.value is not None, walk.get_subnodes_by_type(parent, ast.Return), ))) last_value_return = ( len(parent.body) > 1 and returns < 2 and isinstance(node.value, ast.NameConstant) and node.value.value is None ) one_return_with_none = ( returns == 1 and isinstance(node.value, ast.NameConstant) and node.value.value is None ) if node.value is None or last_value_return or one_return_with_none: self.add_violation(InconsistentReturnViolation(node))
def _check_generator(self, node: AnyFunctionDef) -> None: if not functions.is_generator(node): return for sub_node in walk.get_subnodes_by_type(node, ast.Raise): if exceptions.get_exception_name(sub_node) == 'StopIteration': self.add_violation( StopIterationInsideGeneratorViolation(sub_node), )
def _check_public_attributes(self, node: ast.ClassDef) -> None: attributes = walk.get_subnodes_by_type(node, ast.Attribute) self_public_attrs = filter(_is_public_instance_attr_def, attributes) attrs_count = len(list(self_public_attrs)) if attrs_count > self.options.max_attributes: self.add_violation( TooManyPublicAttributesViolation(node, text=str(attrs_count)), )
def _check_nested_ifexpr(self, node: AnyIf) -> None: is_nested_in_if = bool( isinstance(node, ast.If) and list(walk.get_subnodes_by_type(node.test, ast.IfExp)), ) is_nested_poorly = walk.get_closest_parent( node, self._forbidden_expression_parents, ) if is_nested_in_if or is_nested_poorly: self.add_violation(NestedTernaryViolation(node))
def _check_public_attributes(self, node: ast.ClassDef) -> None: attributes = filter( self._is_public_instance_attr_def, walk.get_subnodes_by_type(node, ast.Attribute), ) attrs_count = len({attr.attr for attr in attributes}) if attrs_count > self.options.max_attributes: self.add_violation( TooManyPublicAttributesViolation( node, text=str(attrs_count), baseline=self.options.max_attributes, ), )
def _check_unpacking_target_types(self, node: Optional[ast.AST]) -> None: if not node: return for subnode in walk.get_subnodes_by_type(node, ast.List): self.add_violation( consistency.UnpackingIterableToListViolation(subnode), )