code: def _parse(self, func_ast):
      self.num_args = len(func_ast.args.args)
      tail = func_ast.body[-1]
  
      # end doesn't need a transition
      if self.name == "end":
          # TYPE: end
          self.type = "end"
  
      # ensure that the tail an expression
      if not isinstance(tail, ast.Expr):
          return
  
      # determine the type of self.next transition
      try:
          if not self._expr_str(tail.value.func) == "self.next":
              return
  
          self.has_tail_next = True
          self.invalid_tail_next = True
          self.tail_next_lineno = tail.lineno
          self.out_funcs = [e.attr for e in tail.value.args]
  
          keywords = dict(
              (k.arg, getattr(k.value, "s", None))
              for k in tail.value.keywords
          )
          if len(keywords) == 1:
              if "foreach" in keywords:
                  # TYPE: foreach
                  self.type = "foreach"
                  if len(self.out_funcs) == 1:
                      self.foreach_param = keywords["foreach"]
                      self.invalid_tail_next = False
              elif "num_parallel" in keywords:
                  self.type = "foreach"
                  self.parallel_foreach = True
                  if len(self.out_funcs) == 1:
                      self.num_parallel = keywords["num_parallel"]
                      self.invalid_tail_next = False
          elif len(keywords) == 0:
              if len(self.out_funcs) > 1:
                  # TYPE: split
                  self.type = "split"
                  self.invalid_tail_next = False
              elif len(self.out_funcs) == 1:
                  # TYPE: linear
                  if self.name == "start":
                      self.type = "start"
                  elif self.num_args > 1:
                      self.type = "join"
                  else:
                      self.type = "linear"
                  self.invalid_tail_next = False
      except AttributeError:
          return
  
imports: import inspect
  import ast
  import re
label_desc: Use image node_id 3 for calling the DAGNode obj's underlying member method code with example usage: obj._parse(func_ast) without return types