#------------------------------------------------------------------------------- # elftools: common/py3compat.py # # Python 2/3 compatibility code # # Eli Bendersky (eliben@gmail.com) # This code is in the public domain #------------------------------------------------------------------------------- import sys PY3 = sys.version_info[0] == 3 if PY3: import io StringIO = io.StringIO BytesIO = io.BytesIO # Functions for acting on bytestrings and strings. In Python 2 and 3, # strings and bytes are the same and chr/ord can be used to convert between # numeric byte values and their string pepresentations. In Python 3, bytes # and strings are different types and bytes hold numeric values when # iterated over. def bytes2str(b): return b.decode('latin-1') def str2bytes(s): return s.encode('latin-1') def int2byte(i): return bytes((i,)) def byte2int(b): return b def iterbytes(b): """Return an iterator over the elements of a bytes object. For example, for b'abc' yields b'a', b'b' and then b'c'. """ for i in range(len(b)): yield b[i:i+1] ifilter = filter maxint = sys.maxsize else: import cStringIO StringIO = BytesIO = cStringIO.StringIO def bytes2str(b): return b def str2bytes(s): return s int2byte = chr byte2int = ord def iterbytes(b): return iter(b) from itertools import ifilter maxint = sys.maxint def iterkeys(d): """Return an iterator over the keys of a dictionary.""" return getattr(d, 'keys' if PY3 else 'iterkeys')() def itervalues(d): """Return an iterator over the values of a dictionary.""" return getattr(d, 'values' if PY3 else 'itervalues')() def iteritems(d): """Return an iterator over the items of a dictionary.""" return getattr(d, 'items' if PY3 else 'iteritems')() try: from collections.abc import Mapping # python >= 3.3 except ImportError: from collections import Mapping # python < 3.3