code: def output_dot(self):
      def edge_specs():
          for node in self.nodes.values():
              for edge in node.out_funcs:
                  yield "%s -> %s;" % (node.name, edge)
  
      def node_specs():
          for node in self.nodes.values():
              nodetype = "join" if node.num_args > 1 else node.type
              yield '"{0.name}"' '[ label = <<b>{0.name}</b> | <font point-size="10">{type}</font>> ' '  fontname = "Helvetica" ' '  shape = "record" ];'.format(
                  node, type=nodetype
              )
  
      return (
          "digraph {0.name} {{\n"
          "{nodes}\n"
          "{edges}\n"
          "}}".format(
              self,
              nodes="\n".join(node_specs()),
              edges="\n".join(edge_specs()),
          )
      )
  
imports: import inspect
  import ast
  import re
label_desc: Use image node_id 9 for calling the FlowGraph obj's underlying member method code with example usage: obj.output_dot() and returns: str