parameters: (url)
return_statement: return Url(
          scheme=ensure_type(scheme),
          auth=ensure_type(auth),
          host=ensure_type(host),
          port=port,
          path=ensure_type(path),
          query=ensure_type(query),
          fragment=ensure_type(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.
      This parser is RFC 3986 compliant.
  
      The parser logic and helper functions are based heavily on
      work done in the ``rfc3986`` module.
  
      :param str url: URL to parse into a :class:`.Url` namedtuple.
  
      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.
      This parser is RFC 3986 compliant.
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 . This parser is RFC 3986 compliant .
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.
      This parser is RFC 3986 compliant.
  
      The parser logic and helper functions are based heavily on
      work done in the ``rfc3986`` module.
  
      :param str url: URL to parse into a :class:`.Url` namedtuple.
  
      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', ...)
      """
      if not url:
          # Empty
          return Url()
  
      source_url = url
      if not SCHEME_RE.search(url):
          url = "//" + url
  
      try:
          scheme, authority, path, query, fragment = URI_RE.match(url).groups()
          normalize_uri = scheme is None or scheme.lower() in NORMALIZABLE_SCHEMES
  
          if scheme:
              scheme = scheme.lower()
  
          if authority:
              auth, host, port = SUBAUTHORITY_RE.match(authority).groups()
              if auth and normalize_uri:
                  auth = _encode_invalid_chars(auth, USERINFO_CHARS)
              if port == "":
                  port = None
          else:
              auth, host, port = None, None, None
  
          if port is not None:
              port = int(port)
              if not (0 <= port <= 65535):
                  raise LocationParseError(url)
  
          host = _normalize_host(host, scheme)
  
          if normalize_uri and path:
              path = _remove_path_dot_segments(path)
              path = _encode_invalid_chars(path, PATH_CHARS)
          if normalize_uri and query:
              query = _encode_invalid_chars(query, QUERY_CHARS)
          if normalize_uri and fragment:
              fragment = _encode_invalid_chars(fragment, FRAGMENT_CHARS)
  
      except (ValueError, AttributeError):
          return six.raise_from(LocationParseError(source_url), None)
  
      # For the sake of backwards compatibility we put empty
      # string values for path if there are any defined values
      # beyond the path in the URL.
      # TODO: Remove this when we break backwards compatibility.
      if not path:
          if query is not None or fragment is not None:
              path = ""
          else:
              path = None
  
      # Ensure that each part of the URL is a `str` for
      # backwards compatibility.
      if isinstance(url, six.text_type):
          ensure_func = six.ensure_text
      else:
          ensure_func = six.ensure_str
  
      def ensure_type(x):
          return x if x is None else ensure_func(x)
  
      return Url(
          scheme=ensure_type(scheme),
          auth=ensure_type(auth),
          host=ensure_type(host),
          port=port,
          path=ensure_type(path),
          query=ensure_type(query),
          fragment=ensure_type(fragment),
      )
function_tokens: def parse_url ( url ) : if not url : # Empty return Url ( ) source_url = url if not SCHEME_RE . search ( url ) : url = "//" + url try : scheme , authority , path , query , fragment = URI_RE . match ( url ) . groups ( ) normalize_uri = scheme is None or scheme . lower ( ) in NORMALIZABLE_SCHEMES if scheme : scheme = scheme . lower ( ) if authority : auth , host , port = SUBAUTHORITY_RE . match ( authority ) . groups ( ) if auth and normalize_uri : auth = _encode_invalid_chars ( auth , USERINFO_CHARS ) if port == "" : port = None else : auth , host , port = None , None , None if port is not None : port = int ( port ) if not ( 0 <= port <= 65535 ) : raise LocationParseError ( url ) host = _normalize_host ( host , scheme ) if normalize_uri and path : path = _remove_path_dot_segments ( path ) path = _encode_invalid_chars ( path , PATH_CHARS ) if normalize_uri and query : query = _encode_invalid_chars ( query , QUERY_CHARS ) if normalize_uri and fragment : fragment = _encode_invalid_chars ( fragment , FRAGMENT_CHARS ) except ( ValueError , AttributeError ) : return six . raise_from ( LocationParseError ( source_url ) , None ) # For the sake of backwards compatibility we put empty # string values for path if there are any defined values # beyond the path in the URL. # TODO: Remove this when we break backwards compatibility. if not path : if query is not None or fragment is not None : path = "" else : path = None # Ensure that each part of the URL is a `str` for # backwards compatibility. if isinstance ( url , six . text_type ) : ensure_func = six . ensure_text else : ensure_func = six . ensure_str def ensure_type ( x ) : return x if x is None else ensure_func ( x ) return Url ( scheme = ensure_type ( scheme ) , auth = ensure_type ( auth ) , host = ensure_type ( host ) , port = port , path = ensure_type ( path ) , query = ensure_type ( query ) , fragment = ensure_type ( fragment ) , )