1""" 2Python 2/3 compatibility helpers. 3 4Note: This module is *not* public API. 5""" 6import contextlib 7import operator 8import sys 9 10 11try: 12 from collections.abc import MutableMapping, Sequence # noqa 13except ImportError: 14 from collections import MutableMapping, Sequence # noqa 15 16PY3 = sys.version_info[0] >= 3 17 18if PY3: 19 zip = zip 20 from functools import lru_cache 21 from io import StringIO as NativeIO 22 from urllib.parse import ( 23 unquote, urljoin, urlunsplit, SplitResult, urlsplit 24 ) 25 from urllib.request import pathname2url, urlopen 26 str_types = str, 27 int_types = int, 28 iteritems = operator.methodcaller("items") 29else: 30 from itertools import izip as zip # noqa 31 from io import BytesIO as NativeIO 32 from urlparse import urljoin, urlunsplit, SplitResult, urlsplit 33 from urllib import pathname2url, unquote # noqa 34 import urllib2 # noqa 35 def urlopen(*args, **kwargs): 36 return contextlib.closing(urllib2.urlopen(*args, **kwargs)) 37 38 str_types = basestring 39 int_types = int, long 40 iteritems = operator.methodcaller("iteritems") 41 42 from functools32 import lru_cache 43 44 45def urldefrag(url): 46 if "#" in url: 47 s, n, p, q, frag = urlsplit(url) 48 defrag = urlunsplit((s, n, p, q, "")) 49 else: 50 defrag = url 51 frag = "" 52 return defrag, frag 53 54 55# flake8: noqa 56