2013-03-20 4 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 소스 코드를 적어도 2.6에서 "ssh"가 누락되었습니다. – hd1

답변

2

당신이 urlunparse에 전달하는 data 튜플은 다음과 같은 구성 요소가

scheme, netloc, url, query, fragment = data 

이 더 netloc없는, 그리고 schemeuses_netloc하지 않을 경우, URL이

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://로 시작하는 URL을받을 수 있나요 :

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

그래서 올바르게 동작을 변경하는 것을 이해하면 urlparse.uses_netloc.append ('ssh')를 사용할 수 있습니다. 그 맞습니까? –

+0

Eek, 아니요. URL 사양이 아닙니다. 나는 urlparse 모듈의 설계자보다 스펙에 대해 잘 안다는 것을 알고있다. 그래서'uses_netloc'을 바꾸지 않는 것이 좋습니다. – unutbu