docs: def get_ancestors(self, obj):
          """Return a list of all ancestor nodes of the :class:`.Node` *obj*.
  
          The list is ordered from the most shallow ancestor (greatest great-
          grandparent) to the direct parent. The node itself is not included in
          the list. For example::
  
              >>> text = "{{a|{{b|{{c|{{d}}}}}}}}"
              >>> code = mwparserfromhell.parse(text)
              >>> node = code.filter_templates(matches=lambda n: n == "{{d}}")[0]
              >>> code.get_ancestors(node)
              ['{{a|{{b|{{c|{{d}}}}}}}}', '{{b|{{c|{{d}}}}}}', '{{c|{{d}}}}']
  
          Will return an empty list if *obj* is at the top level of this Wikicode
          object. Will raise :exc:`ValueError` if it wasn't found.
          """
          def _get_ancestors(code, needle):
              for node in code.nodes:
                  if node is needle:
                      return []
                  for code in node.__children__():
                      ancestors = _get_ancestors(code, needle)
                      if ancestors is not None:
                          return [node] + ancestors
  
          if isinstance(obj, Wikicode):
              obj = obj.get(0)
          elif not isinstance(obj, Node):
              raise ValueError(obj)
  
          ancestors = _get_ancestors(self, obj)
          if ancestors is None:
              raise ValueError(obj)
          return ancestors