为什么urlparse.urlenparse的工作不一致?

2024-09-22 20:25:06 发布

您现在位置:Python中文网/ 问答频道 /正文

当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'

这是一个bug还是一个特性? 我希望urlunparse的行为总是和第一个示例一样,即使scheme未被识别。在


Tags: pathtestnonehttp示例ftp特性bug
1条回答
网友
1楼 · 发布于 2024-09-22 20:25:06

传递给data元组的urlunparse包含以下组件:

scheme, netloc, url, query, fragment = data

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

^{pr2}$

这就是urlunparse(调用urlunsplit)is defined

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']

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

In [140]: urlparse.urlunparse(('ssh','netloc','test_path', None, None, None))
Out[140]: 'ssh://netloc/test_path'

相关问题 更多 >