docs: def postorder(self, node=None):
          """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.
          """
          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)