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