1import sys
2import array
3
4PY2 = sys.version_info[0] == 2
5
6_identity = lambda x: x
7
8
9if not PY2:
10    text_type = str
11    string_types = (str,)
12    integer_types = (int, )
13
14    text_to_native = lambda s, enc: s
15    unichr = chr
16
17    iterkeys = lambda d: iter(d.keys())
18    itervalues = lambda d: iter(d.values())
19    iteritems = lambda d: iter(d.items())
20
21    from io import StringIO, BytesIO
22    import pickle
23
24    izip = zip
25    imap = map
26    range_type = range
27
28    cmp = lambda a, b: (a > b) - (a < b)
29
30    array_tobytes = array.array.tobytes
31    from collections import abc
32
33else:
34    text_type = unicode
35    string_types = (str, unicode)
36    integer_types = (int, long)
37
38    text_to_native = lambda s, enc: s.encode(enc)
39    unichr = unichr
40
41    iterkeys = lambda d: d.iterkeys()
42    itervalues = lambda d: d.itervalues()
43    iteritems = lambda d: d.iteritems()
44
45    from cStringIO import StringIO as BytesIO
46    from StringIO import StringIO
47    import cPickle as pickle
48
49    from itertools import imap
50    from itertools import izip
51    range_type = xrange
52
53    cmp = cmp
54
55    array_tobytes = array.array.tostring
56    import collections as abc
57
58number_types = integer_types + (float,)
59
60
61def force_text(s, encoding='utf-8', errors='strict'):
62    if isinstance(s, text_type):
63        return s
64    if isinstance(s, bytes):
65        return s.decode(encoding, errors)
66    return text_type(s)
67
68
69#
70# Since Python 3.3, a fast decimal implementation is already included in the
71# standard library.  Otherwise use cdecimal when available
72#
73if sys.version_info[:2] >= (3, 3):
74    import decimal
75else:
76    try:
77        import cdecimal as decimal
78    except ImportError:
79        import decimal
80