code: def ancestors(self, recurs=True, context=None):
          
          # FIXME: should be possible to choose the resolution order
          # FIXME: inference make infinite loops possible here
          yielded = {self}
          if context is None:
              context = contextmod.InferenceContext()
          if not self.bases and self.qname() != "builtins.object":
              yield builtin_lookup("object")[1][0]
              return
  
          for stmt in self.bases:
              with context.restore_path():
                  try:
                      for baseobj in stmt.infer(context):
                          if not isinstance(baseobj, ClassDef):
                              if isinstance(baseobj, bases.Instance):
                                  baseobj = baseobj._proxied
                              else:
                                  continue
                          if not baseobj.hide:
                              if baseobj in yielded:
                                  continue
                              yielded.add(baseobj)
                              yield baseobj
                          if not recurs:
                              continue
                          for grandpa in baseobj.ancestors(recurs=True, context=context):
                              if grandpa is self:
                                  # This class is the ancestor of itself.
                                  break
                              if grandpa in yielded:
                                  continue
                              yielded.add(grandpa)
                              yield grandpa
                  except exceptions.InferenceError:
                      continue
docs: Iterate over the base classes in prefixed depth first order.
  
          :param recurs: Whether to recurse or return direct ancestors only.
          :type recurs: bool
  
          :returns: The base classes
          :rtype: iterable(NodeNG)