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