code: def get_mro(self, space):
          
          seqs = [self.get_mro(base) for base
                  in self.get_bases(space)] + [list(self.get_bases(space))]
          res = []
          while True:
              non_empty = list(filter(None, seqs))
  
              if not non_empty:
                  # Nothing left to process, we're done.
                  res.insert(0, space)
                  return res
  
              for seq in non_empty:  # Find merge candidates among seq heads.
                  candidate = seq[0]
                  not_head = [s for s in non_empty if candidate in s[1:]]
                  if not_head:
                      # Reject the candidate.
                      candidate = None
                  else:
                      break
  
              if not candidate:
                  raise TypeError(
                      "inconsistent hierarchy, no C3 MRO is possible")
  
              res.append(candidate)
  
              for seq in non_empty:
                  # Remove candidate.
                  if seq[0] == candidate:
                      del seq[0]
docs: Calculate the Method Resolution Order of bases using the C3 algorithm.
  
          Code modified from
          http://code.activestate.com/recipes/577748-calculate-the-mro-of-a-class/
  
          Args:
              bases: sequence of direct base spaces.
  
          Returns:
              mro as a list of bases including node itself