# bf.py -- Terry Jan Reedy, 2013 Oct 8 "bytes version of str.format, as function" import re def bf(form, obs): "Return bytes-formated objects interpolated into bytes form." fields = re.split(b'{:?([^}]*)}', form) print(fields) if len(fields) != 2*len(obs)+1: raise ValueError('Number of replacement fields not same as len(obs)') j = 1 # index into fields for ob in obs: field = fields[j] fields[j] = format(ob, field.decode()).encode() if field else ob j += 2 return b''.join(fields) # test code form = b"bytes: {} and {:}; int: {:5d}; float: {:7.2f}; end" obs = (b'somebytes', b'morebytes', 123, 12.3) exp = form.decode().format(*( (ob.decode() if isinstance(ob, bytes) else ob) for ob in obs)).encode() res = bf(form, obs) print(exp) print(res) assert res == exp