def METHOD_NAME(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. No whitespace, no plus or
            # minus prefixes, no non-integer digits such as ^2 (superscript).
            if not port.isdigit():
                raise LocationParseError(url)
            try:
                port = int(port)
            except ValueError:
                raise LocationParseError(url)
        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)