bpo-35397: Remove deprecation and document urllib.parse.unwrap (GH-11481)

diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py
index d0365ec..4344765 100644
--- a/Lib/test/test_urlparse.py
+++ b/Lib/test/test_urlparse.py
@@ -1169,8 +1169,10 @@
                           'http://www.python.org/medi\u00e6val')
 
     def test_unwrap(self):
-        url = urllib.parse._unwrap('<URL:type://host/path>')
-        self.assertEqual(url, 'type://host/path')
+        for wrapped_url in ('<URL:scheme://host/path>', '<scheme://host/path>',
+                            'URL:scheme://host/path', 'scheme://host/path'):
+            url = urllib.parse.unwrap(wrapped_url)
+            self.assertEqual(url, 'scheme://host/path')
 
 
 class DeprecationTest(unittest.TestCase):
@@ -1251,12 +1253,6 @@
         self.assertEqual(str(cm.warning),
                          'urllib.parse.to_bytes() is deprecated as of 3.8')
 
-    def test_unwrap(self):
-        with self.assertWarns(DeprecationWarning) as cm:
-            urllib.parse.unwrap('')
-        self.assertEqual(str(cm.warning),
-                         'urllib.parse.unwrap() is deprecated as of 3.8')
-
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
index dfba704..daefb20 100644
--- a/Lib/urllib/parse.py
+++ b/Lib/urllib/parse.py
@@ -979,17 +979,15 @@
 
 
 def unwrap(url):
-    warnings.warn("urllib.parse.unwrap() is deprecated as of 3.8",
-                  DeprecationWarning, stacklevel=2)
-    return _unwrap(url)
+    """Transform a string like '<URL:scheme://host/path>' into 'scheme://host/path'.
 
-
-def _unwrap(url):
-    """unwrap('<URL:type://host/path>') --> 'type://host/path'."""
+    The string is returned unchanged if it's not a wrapped URL.
+    """
     url = str(url).strip()
     if url[:1] == '<' and url[-1:] == '>':
         url = url[1:-1].strip()
-    if url[:4] == 'URL:': url = url[4:].strip()
+    if url[:4] == 'URL:':
+        url = url[4:].strip()
     return url
 
 
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index afce8eb..f6ce9cb 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -101,7 +101,7 @@
 
 from urllib.error import URLError, HTTPError, ContentTooShortError
 from urllib.parse import (
-    urlparse, urlsplit, urljoin, _unwrap, quote, unquote,
+    urlparse, urlsplit, urljoin, unwrap, quote, unquote,
     _splittype, _splithost, _splitport, _splituser, _splitpasswd,
     _splitattr, _splitquery, _splitvalue, _splittag, _to_bytes,
     unquote_to_bytes, urlunparse)
@@ -349,7 +349,7 @@
     @full_url.setter
     def full_url(self, url):
         # unwrap('<URL:type://host/path>') --> 'type://host/path'
-        self._full_url = _unwrap(url)
+        self._full_url = unwrap(url)
         self._full_url, self.fragment = _splittag(self._full_url)
         self._parse()
 
@@ -1727,7 +1727,7 @@
     # External interface
     def open(self, fullurl, data=None):
         """Use URLopener().open(file) instead of open(file, 'r')."""
-        fullurl = _unwrap(_to_bytes(fullurl))
+        fullurl = unwrap(_to_bytes(fullurl))
         fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]|")
         if self.tempcache and fullurl in self.tempcache:
             filename, headers = self.tempcache[fullurl]
@@ -1775,7 +1775,7 @@
     def retrieve(self, url, filename=None, reporthook=None, data=None):
         """retrieve(url) returns (filename, headers) for a local object
         or (tempfilename, headers) for a remote object."""
-        url = _unwrap(_to_bytes(url))
+        url = unwrap(_to_bytes(url))
         if self.tempcache and url in self.tempcache:
             return self.tempcache[url]
         type, url1 = _splittype(url)