code: def join(cls, splits, *namables):
      
      isplits = []
      unbound = []
      for ref in splits:
        if isinstance(ref, Ref):
          resolved = False
          for namable in namables:
            try:
              value = namable.find(ref)
              resolved = True
              break
            except Namable.Error:
              continue
          if resolved:
            isplits.append(value)
          else:
            isplits.append(ref)
            unbound.append(ref)
        else:
          isplits.append(ref)
      return (''.join(map(str if Compatibility.PY3 else unicode, isplits)), unbound)
docs: Interpolate strings.
  
        :params splits: The output of Parser.split(string)
        :params namables: A sequence of Namable objects in which the interpolation should take place.
  
        Returns 2-tuple containing:
          joined string, list of unbound object ids (potentially empty)