1import inspect
2
3import six
4
5if six.PY3:
6    import urllib.parse as urlparse
7    from urllib.parse import quote, unquote_plus
8    from urllib.request import urlopen, URLError
9    from html import escape
10    izip = zip
11else:
12    import urlparse  # noqa
13    from urllib import quote, unquote_plus  # noqa
14    from urllib2 import urlopen, URLError  # noqa
15    from cgi import escape  # noqa
16    from itertools import izip
17
18
19def is_bound_method(ob):
20    return inspect.ismethod(ob) and six.get_method_self(ob) is not None
21
22
23def getargspec(func):
24    import sys
25    if sys.version_info < (3, 5):
26        return inspect.getargspec(func)
27
28    from collections import namedtuple
29    ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults')
30    args, varargs, keywords, defaults = inspect.getfullargspec(func)[:4]
31    return ArgSpec(args=args, varargs=varargs, keywords=keywords,
32                   defaults=defaults)
33