parameters: (paths)
docstring: Given a sequence of path names, returns the longest common sub-path.
docstring_summary: Given a sequence of path names, returns the longest common sub-path.
docstring_tokens: Given a sequence of path names returns the longest common sub - path .
function: def commonpath(paths):
      """Given a sequence of path names, returns the longest common sub-path."""
  
      if not paths:
          raise ValueError('commonpath() arg is an empty sequence')
  
      paths = tuple(map(os.fspath, paths))
      if isinstance(paths[0], bytes):
          sep = b'\\'
          altsep = b'/'
          curdir = b'.'
      else:
          sep = '\\'
          altsep = '/'
          curdir = '.'
  
      try:
          drivesplits = [splitdrive(p.replace(altsep, sep).lower()) for p in paths]
          split_paths = [p.split(sep) for d, p in drivesplits]
  
          try:
              isabs, = set(p[:1] == sep for d, p in drivesplits)
          except ValueError:
              raise ValueError("Can't mix absolute and relative paths") from None
  
          # Check that all drive letters or UNC paths match. The check is made only
          # now otherwise type errors for mixing strings and bytes would not be
          # caught.
          if len(set(d for d, p in drivesplits)) != 1:
              raise ValueError("Paths don't have the same drive")
  
          drive, path = splitdrive(paths[0].replace(altsep, sep))
          common = path.split(sep)
          common = [c for c in common if c and c != curdir]
  
          split_paths = [[c for c in s if c and c != curdir] for s in split_paths]
          s1 = min(split_paths)
          s2 = max(split_paths)
          for i, c in enumerate(s1):
              if c != s2[i]:
                  common = common[:i]
                  break
          else:
              common = common[:len(s1)]
  
          prefix = drive + sep if isabs else drive
          return prefix + sep.join(common)
      except (TypeError, AttributeError):
          genericpath._check_arg_types('commonpath', *paths)
          raise
function_tokens: def commonpath ( paths ) : if not paths : raise ValueError ( 'commonpath() arg is an empty sequence' ) paths = tuple ( map ( os . fspath , paths ) ) if isinstance ( paths [ 0 ] , bytes ) : sep = b'\\' altsep = b'/' curdir = b'.' else : sep = '\\' altsep = '/' curdir = '.' try : drivesplits = [ splitdrive ( p . replace ( altsep , sep ) . lower ( ) ) for p in paths ] split_paths = [ p . split ( sep ) for d , p in drivesplits ] try : isabs , = set ( p [ : 1 ] == sep for d , p in drivesplits ) except ValueError : raise ValueError ( "Can't mix absolute and relative paths" ) from None # Check that all drive letters or UNC paths match. The check is made only # now otherwise type errors for mixing strings and bytes would not be # caught. if len ( set ( d for d , p in drivesplits ) ) != 1 : raise ValueError ( "Paths don't have the same drive" ) drive , path = splitdrive ( paths [ 0 ] . replace ( altsep , sep ) ) common = path . split ( sep ) common = [ c for c in common if c and c != curdir ] split_paths = [ [ c for c in s if c and c != curdir ] for s in split_paths ] s1 = min ( split_paths ) s2 = max ( split_paths ) for i , c in enumerate ( s1 ) : if c != s2 [ i ] : common = common [ : i ] break else : common = common [ : len ( s1 ) ] prefix = drive + sep if isabs else drive return prefix + sep . join ( common ) except ( TypeError , AttributeError ) : genericpath . _check_arg_types ( 'commonpath' , * paths ) raise