parameters: (uri)
return_statement: return ''.join(parts)
docstring: Un-escape any percent-escape sequences in a URI that are unreserved
      characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
  
      :rtype: str
docstring_summary: Un-escape any percent-escape sequences in a URI that are unreserved
      characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
docstring_tokens: Un - escape any percent - escape sequences in a URI that are unreserved characters . This leaves all reserved illegal and non - ASCII bytes encoded .
function: def unquote_unreserved(uri):
      """Un-escape any percent-escape sequences in a URI that are unreserved
      characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
  
      :rtype: str
      """
      parts = uri.split('%')
      for i in range(1, len(parts)):
          h = parts[i][0:2]
          if len(h) == 2 and h.isalnum():
              try:
                  c = chr(int(h, 16))
              except ValueError:
                  raise InvalidURL("Invalid percent-escape sequence: '%s'" % h)
  
              if c in UNRESERVED_SET:
                  parts[i] = c + parts[i][2:]
              else:
                  parts[i] = '%' + parts[i]
          else:
              parts[i] = '%' + parts[i]
      return ''.join(parts)
function_tokens: def unquote_unreserved ( uri ) : parts = uri . split ( '%' ) for i in range ( 1 , len ( parts ) ) : h = parts [ i ] [ 0 : 2 ] if len ( h ) == 2 and h . isalnum ( ) : try : c = chr ( int ( h , 16 ) ) except ValueError : raise InvalidURL ( "Invalid percent-escape sequence: '%s'" % h ) if c in UNRESERVED_SET : parts [ i ] = c + parts [ i ] [ 2 : ] else : parts [ i ] = '%' + parts [ i ] else : parts [ i ] = '%' + parts [ i ] return '' . join ( parts )