def is_error(node: astroid.node_classes.NodeNG) -> bool: """return true if the function does nothing but raising an exception""" raises = False returns = False for child_node in node.nodes_of_class((astroid.Raise, astroid.Return)): if isinstance(child_node, astroid.Raise): raises = True if isinstance(child_node, astroid.Return): returns = True return raises and not returns
def is_defined_in_scope( var_node: astroid.node_classes.NodeNG, varname: str, scope: astroid.node_classes.NodeNG, ) -> bool: if isinstance(scope, astroid.If): for node in scope.body: if ( isinstance(node, astroid.Assign) and any( isinstance(target, astroid.AssignName) and target.name == varname for target in node.targets ) ) or (isinstance(node, astroid.Nonlocal) and varname in node.names): return True elif isinstance(scope, (COMP_NODE_TYPES, astroid.For)): for ass_node in scope.nodes_of_class(astroid.AssignName): if ass_node.name == varname: return True elif isinstance(scope, astroid.With): for expr, ids in scope.items: if expr.parent_of(var_node): break if ids and isinstance(ids, astroid.AssignName) and ids.name == varname: return True elif isinstance(scope, (astroid.Lambda, astroid.FunctionDef)): if scope.args.is_argument(varname): # If the name is found inside a default value # of a function, then let the search continue # in the parent's tree. if scope.args.parent_of(var_node): try: scope.args.default_value(varname) scope = scope.parent is_defined_in_scope(var_node, varname, scope) except astroid.NoDefault: pass return True if getattr(scope, "name", None) == varname: return True elif isinstance(scope, astroid.ExceptHandler): if isinstance(scope.name, astroid.AssignName): ass_node = scope.name if ass_node.name == varname: return True return False
def get_nodes( self, statement: astroid.node_classes.NodeNG ) -> Generator[astroid.node_classes.NodeNG, None, None]: multiple_nodes = lambda nodes: chain.from_iterable( self.get_nodes(node) for node in nodes) if isinstance(statement, astroid.Assign): # RHS is evaluated before assigned in an assignment statement yield from self.get_nodes(statement.value) yield from multiple_nodes( statement.targets) # statement.targets is a list of nodes elif isinstance(statement, (astroid.ListComp, astroid.SetComp, astroid.DictComp, astroid.GeneratorExp)): # Comprehension targets are assigned before expression is evaluated. yield from multiple_nodes( statement.generators ) # statement.generators is a list of nodes yield from self.get_nodes(statement.elt) else: yield from statement.nodes_of_class( (astroid.AssignName, astroid.DelName, astroid.Name), astroid.FunctionDef)