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

がなくnetlocschemeが にない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']

を指定すると、次で始まる URL が取得されssh://ますnetloc

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