parameters: (url)
return_statement: return Url(scheme, auth, host, port, path, query, fragment)
docstring: Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
      performed to parse incomplete urls. Fields not provided will be None.
  
      Partly backwards-compatible with :mod:`urlparse`.
  
      Example::
  
          >>> parse_url('http://google.com/mail/')
          Url(scheme='http', host='google.com', port=None, path='/mail/', ...)
          >>> parse_url('google.com:80')
          Url(scheme=None, host='google.com', port=80, path=None, ...)
          >>> parse_url('/foo?bar')
          Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
docstring_summary: Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
      performed to parse incomplete urls. Fields not provided will be None.
docstring_tokens: Given a url return a parsed : class : . Url namedtuple . Best - effort is performed to parse incomplete urls . Fields not provided will be None .
function: def parse_url(url):
      """
      Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
      performed to parse incomplete urls. Fields not provided will be None.
  
      Partly backwards-compatible with :mod:`urlparse`.
  
      Example::
  
          >>> parse_url('http://google.com/mail/')
          Url(scheme='http', host='google.com', port=None, path='/mail/', ...)
          >>> parse_url('google.com:80')
          Url(scheme=None, host='google.com', port=80, path=None, ...)
          >>> parse_url('/foo?bar')
          Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
      """
  
      # While this code has overlap with stdlib's urlparse, it is much
      # simplified for our needs and less annoying.
      # Additionally, this implementations does silly things to be optimal
      # on CPython.
  
      if not url:
          # Empty
          return Url()
  
      scheme = None
      auth = None
      host = None
      port = None
      path = None
      fragment = None
      query = None
  
      # Scheme
      if '://' in url:
          scheme, url = url.split('://', 1)
  
      # Find the earliest Authority Terminator
      # (http://tools.ietf.org/html/rfc3986#section-3.2)
      url, path_, delim = split_first(url, ['/', '?', '#'])
  
      if delim:
          # Reassemble the path
          path = delim + path_
  
      # Auth
      if '@' in url:
          # Last '@' denotes end of auth part
          auth, url = url.rsplit('@', 1)
  
      # IPv6
      if url and url[0] == '[':
          host, url = url.split(']', 1)
          host += ']'
  
      # Port
      if ':' in url:
          _host, port = url.split(':', 1)
  
          if not host:
              host = _host
  
          if port:
              # If given, ports must be integers.
              if not port.isdigit():
                  raise LocationParseError(url)
              port = int(port)
          else:
              # Blank ports are cool, too. (rfc3986#section-3.2.3)
              port = None
  
      elif not host and url:
          host = url
  
      if not path:
          return Url(scheme, auth, host, port, path, query, fragment)
  
      # Fragment
      if '#' in path:
          path, fragment = path.split('#', 1)
  
      # Query
      if '?' in path:
          path, query = path.split('?', 1)
  
      return Url(scheme, auth, host, port, path, query, fragment)
function_tokens: def parse_url ( url ) : # While this code has overlap with stdlib's urlparse, it is much # simplified for our needs and less annoying. # Additionally, this implementations does silly things to be optimal # on CPython. if not url : # Empty return Url ( ) scheme = None auth = None host = None port = None path = None fragment = None query = None # Scheme if '://' in url : scheme , url = url . split ( '://' , 1 ) # Find the earliest Authority Terminator # (http://tools.ietf.org/html/rfc3986#section-3.2) url , path_ , delim = split_first ( url , [ '/' , '?' , '#' ] ) if delim : # Reassemble the path path = delim + path_ # Auth if '@' in url : # Last '@' denotes end of auth part auth , url = url . rsplit ( '@' , 1 ) # IPv6 if url and url [ 0 ] == '[' : host , url = url . split ( ']' , 1 ) host += ']' # Port if ':' in url : _host , port = url . split ( ':' , 1 ) if not host : host = _host if port : # If given, ports must be integers. if not port . isdigit ( ) : raise LocationParseError ( url ) port = int ( port ) else : # Blank ports are cool, too. (rfc3986#section-3.2.3) port = None elif not host and url : host = url if not path : return Url ( scheme , auth , host , port , path , query , fragment ) # Fragment if '#' in path : path , fragment = path . split ( '#' , 1 ) # Query if '?' in path : path , query = path . split ( '?' , 1 ) return Url ( scheme , auth , host , port , path , query , fragment )