code: def unused(node):
    
    cfg.forward(node, cfg.ReachingDefinitions())
    unused_obj = Unused()
    unused_obj.visit(node)
    return unused_obj.unused
docs: Find unused definitions that can be remove.
  
    This runs reaching definitions analysis followed by a walk over the AST to
    find all variable definitions that are not used later on.
  
    Args:
      node: The AST of e.g. a function body to find unused variable definitions.
  
    Returns:
      unused: After visiting all the nodes, this attribute contanis a set of
          definitions in the form of `(variable_name, node)` pairs which are
          unused in this AST.