3

当netloc为空时urlparse.urlunparse不一致:

>>> urlparse.urlunparse(('http','','test_path', None, None, None))
'http:///test_path'
>>> urlparse.urlunparse(('ftp','','test_path', None, None, None))
'ftp:///test_path'
>>> urlparse.urlunparse(('ssh','','test_path', None, None, None))
'ssh:test_path'

它是错误还是功能?我希望 urlunparse 总是表现得像第一个例子一样,即使方案未被识别。

4

1 回答 1

3

data您传递给的元组urlunparse具有以下组件:

scheme, netloc, url, query, fragment = data

如果没有netloc,并且scheme不在uses_netloc,则 url 为

    url = scheme + ':' + url

这就是定义urlunparse(调用 urlunsplit)的方式:

def urlunsplit(data):
    ...
    scheme, netloc, url, query, fragment = data
    if netloc or (scheme and scheme in uses_netloc and url[:2] != '//'):
        if url and url[:1] != '/': url = '/' + url
        url = '//' + (netloc or '') + url
    if scheme:
        url = scheme + ':' + url

请注意,'ssh'不在uses_netloc

uses_netloc = ['ftp', 'http', 'gopher', 'nntp', 'telnet',
               'imap', 'wais', 'file', 'mms', 'https', 'shttp',
               'snews', 'prospero', 'rtsp', 'rtspu', 'rsync', '',
               'svn', 'svn+ssh', 'sftp','nfs','git', 'git+ssh']

ssh://如果您提供以下内容,您会得到一个以开头的 url netloc

In [140]: urlparse.urlunparse(('ssh','netloc','test_path', None, None, None))
Out[140]: 'ssh://netloc/test_path'
于 2013-03-20T02:50:02.087 回答