code: def postorder(self, node=None):
          
          if node is None:
              node = self.ast
  
          try:
              first = iter(node)
          except TypeError:
              first = None
  
          if first:
              for kid in node:
                  self.postorder(kid)
  
          try:
              name = 'n_' + self.typestring(node)
              if hasattr(self, name):
                  func = getattr(self, name)
                  func(node)
              else:
                  self.default(node)
          except GenericASTTraversalPruningException:
              return
  
          name = name + '_exit'
          if hasattr(self, name):
              func = getattr(self, name)
              func(node)
docs: Walk the tree in roughly 'postorder' (a bit of a lie
          explained below).
  
          For each node with typestring name *name* if the
          node has a method called n_*name*, call that before walking
          children. If there is no method define, call a
          self.default(node) instead. Subclasses of GenericASTTtraversal
          ill probably want to override this method.
  
          If the node has a method called *name*_exit, that is called
          after all children have been called.  So in this sense this
          function is a lie.
  
          In typical use a node with children can call "postorder" in
          any order it wants which may skip children or order then in
          ways other than first to last.  In fact, this this happens.