code: def __str__(self):
      return """*[{0.name} {0.type} (line {0.func_lineno})]*
      in_funcs={in_funcs}
      out_funcs={out_funcs}
      split_parents={parents}
      matching_join={matching_join}
      is_inside_foreach={is_inside_foreach}
      decorators={decos}
      num_args={0.num_args}
      has_tail_next={0.has_tail_next} (line {0.tail_next_lineno})
      invalid_tail_next={0.invalid_tail_next}
      foreach_param={0.foreach_param}
      parallel_step={0.parallel_step}
      parallel_foreach={0.parallel_foreach}
      -> {out}""".format(
          self,
          matching_join=self.matching_join
          and "[%s]" % self.matching_join,
          is_inside_foreach=self.is_inside_foreach,
          out_funcs=", ".join("[%s]" % x for x in self.out_funcs),
          in_funcs=", ".join("[%s]" % x for x in self.in_funcs),
          parents=", ".join("[%s]" % x for x in self.split_parents),
          decos=" | ".join(map(str, self.decorators)),
          out=", ".join("[%s]" % x for x in self.out_funcs),
      )
  
imports: import inspect
  import ast
  import re
label_desc: Use image node_id 4 for calling the DAGNode obj's underlying member method code with example usage: obj.__str__() and returns: str