"""Python 2/3 compat layer.""" from __future__ import print_function, division, absolute_import try: basestring except NameError: basestring = str try: unicode except NameError: unicode = str try: unichr bytechr = chr byteord = ord except: unichr = chr def bytechr(n): return bytes([n]) def byteord(c): return c if isinstance(c, int) else ord(c) try: from StringIO import StringIO except ImportError: from io import BytesIO as StringIO def strjoin(iterable): return ''.join(iterable) if str == bytes: class Tag(str): def tobytes(self): if isinstance(self, bytes): return self else: return self.encode('latin1') def tostr(s, encoding='ascii'): if not isinstance(s, str): return s.encode(encoding) else: return s tobytes = tostr bytesjoin = strjoin else: class Tag(str): @staticmethod def transcode(blob): if not isinstance(blob, str): blob = blob.decode('latin-1') return blob def __new__(self, content): return str.__new__(self, self.transcode(content)) def __ne__(self, other): return not self.__eq__(other) def __eq__(self, other): return str.__eq__(self, self.transcode(other)) def __hash__(self): return str.__hash__(self) def tobytes(self): return self.encode('latin-1') def tostr(s, encoding='ascii'): if not isinstance(s, str): return s.decode(encoding) else: return s def tobytes(s, encoding='ascii'): if not isinstance(s, bytes): return s.encode(encoding) else: return s def bytesjoin(iterable): return b''.join(tobytes(item) for item in iterable)