parameters: (base, url, allow_fragments=True)
return_statement: return urlunparse((scheme, netloc, '/'.join(segments),
                         params, query, fragment))
docstring: Join a base URL and a possibly relative URL to form an absolute
      interpretation of the latter.
docstring_summary: Join a base URL and a possibly relative URL to form an absolute
      interpretation of the latter.
docstring_tokens: Join a base URL and a possibly relative URL to form an absolute interpretation of the latter .
function: def urljoin(base, url, allow_fragments=True):
      """Join a base URL and a possibly relative URL to form an absolute
      interpretation of the latter."""
      if not base:
          return url
      if not url:
          return base
      bscheme, bnetloc, bpath, bparams, bquery, bfragment = \
              urlparse(base, '', allow_fragments)
      scheme, netloc, path, params, query, fragment = \
              urlparse(url, bscheme, allow_fragments)
      if scheme != bscheme or scheme not in uses_relative:
          return url
      if scheme in uses_netloc:
          if netloc:
              return urlunparse((scheme, netloc, path,
                                 params, query, fragment))
          netloc = bnetloc
      if path[:1] == '/':
          return urlunparse((scheme, netloc, path,
                             params, query, fragment))
      if not path and not params:
          path = bpath
          params = bparams
          if not query:
              query = bquery
          return urlunparse((scheme, netloc, path,
                             params, query, fragment))
      segments = bpath.split('/')[:-1] + path.split('/')
      # XXX The stuff below is bogus in various ways...
      if segments[-1] == '.':
          segments[-1] = ''
      while '.' in segments:
          segments.remove('.')
      while 1:
          i = 1
          n = len(segments) - 1
          while i < n:
              if (segments[i] == '..'
                  and segments[i-1] not in ('', '..')):
                  del segments[i-1:i+1]
                  break
              i = i+1
          else:
              break
      if segments == ['', '..']:
          segments[-1] = ''
      elif len(segments) >= 2 and segments[-1] == '..':
          segments[-2:] = ['']
      return urlunparse((scheme, netloc, '/'.join(segments),
                         params, query, fragment))
function_tokens: def urljoin ( base , url , allow_fragments = True ) : if not base : return url if not url : return base bscheme , bnetloc , bpath , bparams , bquery , bfragment = urlparse ( base , '' , allow_fragments ) scheme , netloc , path , params , query , fragment = urlparse ( url , bscheme , allow_fragments ) if scheme != bscheme or scheme not in uses_relative : return url if scheme in uses_netloc : if netloc : return urlunparse ( ( scheme , netloc , path , params , query , fragment ) ) netloc = bnetloc if path [ : 1 ] == '/' : return urlunparse ( ( scheme , netloc , path , params , query , fragment ) ) if not path and not params : path = bpath params = bparams if not query : query = bquery return urlunparse ( ( scheme , netloc , path , params , query , fragment ) ) segments = bpath . split ( '/' ) [ : - 1 ] + path . split ( '/' ) # XXX The stuff below is bogus in various ways... if segments [ - 1 ] == '.' : segments [ - 1 ] = '' while '.' in segments : segments . remove ( '.' ) while 1 : i = 1 n = len ( segments ) - 1 while i < n : if ( segments [ i ] == '..' and segments [ i - 1 ] not in ( '' , '..' ) ) : del segments [ i - 1 : i + 1 ] break i = i + 1 else : break if segments == [ '' , '..' ] : segments [ - 1 ] = '' elif len ( segments ) >= 2 and segments [ - 1 ] == '..' : segments [ - 2 : ] = [ '' ] return urlunparse ( ( scheme , netloc , '/' . join ( segments ) , params , query , fragment ) )