]> granicus.if.org Git - python/commitdiff
Issue 8143: sync unquote in urlparse with urllib; add comment about doing so.
authorR. David Murray <rdmurray@bitdance.com>
Tue, 25 May 2010 15:20:46 +0000 (15:20 +0000)
committerR. David Murray <rdmurray@bitdance.com>
Tue, 25 May 2010 15:20:46 +0000 (15:20 +0000)
unquote is duplicated in the two files to avoid a circular reference.
(This is fixed in Python3.)  Updates keep getting made to the public unquote
without fixing the urlparse one, however, so this fix syncs the two
and adds a comment to both to make sure changes are applied to both.

Lib/urllib.py
Lib/urlparse.py

index de10c7e4e6540934e6cc1ca85b5d9b6c8803c9c2..de67f6721d1c395afe88cd5f2813c28aa2650fc2 100644 (file)
@@ -1156,6 +1156,10 @@ def splitvalue(attr):
     if match: return match.group(1, 2)
     return attr, None
 
+# urlparse contains a duplicate of this method to avoid a circular import.  If
+# you update this method, also update the copy in urlparse.  This code
+# duplication does not exist in Python3.
+
 _hexdig = '0123456789ABCDEFabcdef'
 _hextochr = dict((a + b, chr(int(a + b, 16)))
                  for a in _hexdig for b in _hexdig)
index 65bb9cb33a5f988d9fd7e7f24ef437ce691b8851..2a0407e1cb2d77fd714a8d4442267f6296943643 100644 (file)
@@ -301,25 +301,29 @@ def urldefrag(url):
         return url, ''
 
 # unquote method for parse_qs and parse_qsl
-# Cannot use directly from urllib as it would create circular reference.
-# urllib uses urlparse methods ( urljoin)
-
+# Cannot use directly from urllib as it would create a circular reference
+# because urllib uses urlparse methods (urljoin).  If you update this function,
+# update it also in urllib.  This code duplication does not existin in Python3.
 
 _hexdig = '0123456789ABCDEFabcdef'
-_hextochr = dict((a+b, chr(int(a+b,16))) for a in _hexdig for b in _hexdig)
+_hextochr = dict((a+b, chr(int(a+b,16)))
+                 for a in _hexdig for b in _hexdig)
 
 def unquote(s):
     """unquote('abc%20def') -> 'abc def'."""
     res = s.split('%')
-    for i in xrange(1, len(res)):
-        item = res[i]
+    # fastpath
+    if len(res) == 1:
+        return s
+    s = res[0]
+    for item in res[1:]:
         try:
-            res[i] = _hextochr[item[:2]] + item[2:]
+            s += _hextochr[item[:2]] + item[2:]
         except KeyError:
-            res[i] = '%' + item
+            s += '%' + item
         except UnicodeDecodeError:
-            res[i] = unichr(int(item[:2], 16)) + item[2:]
-    return "".join(res)
+            s += unichr(int(item[:2], 16)) + item[2:]
+    return s
 
 def parse_qs(qs, keep_blank_values=0, strict_parsing=0):
     """Parse a query given as a string argument.