2013-03-20 67 views
3

当netloc是空的urlparse.urlunparse是不一致的:为什么urlparse.urlenparse工作不一致?

>>> 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始终表现得像第一个例子一样,即使方案无法识别。

+0

的里urlparse源代码缺少'ssh',至少2.6。 – hd1 2013-03-20 02:44:33

回答

2

data元组要传递到urlunparse具有以下组件:

scheme, netloc, url, query, fragment = data 

当没有netloc,而schemeuses_netloc,该网址是

url = scheme + ':' + url 

也就是说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://开头的网址:

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

所以如果我理解正确地改变行为,我可以使用urlparse.uses_netloc.append('ssh')。那是对的吗? – 2013-03-20 02:53:57

+0

Eek,no。我没有达到URL规范。我知道我比urlparse模块的设计师更少了解规格。所以我不会建议更改'uses_netloc'。 – unutbu 2013-03-20 02:58:20