Search code examples
pythonpython-3.xstring-formatting

Python 3 bytes formatting


In Python 3, one can format a string like:

"{0}, {1}, {2}".format(1, 2, 3)

But how to format bytes?

b"{0}, {1}, {2}".format(1, 2, 3)

raises AttributeError: 'bytes' object has no attribute 'format'.

If there is no format method for bytes, how to do the formatting or "rewriting" of bytes?


Solution

  • As of Python 3.5, % formatting will work for bytes, too!

    This was part of PEP 461, authored by Ethan Furman:

    PEP: 461
    Title: Adding % formatting to bytes and bytearray
    Version: $Revision$
    Last-Modified: $Date$
    Author: Ethan Furman <ethan at stoneleaf.us>
    Status: Draft
    Type: Standards Track
    Content-Type: text/x-rst
    Created: 2014-01-13
    Python-Version: 3.5
    Post-History: 2014-01-14, 2014-01-15, 2014-01-17, 2014-02-22, 2014-03-25,
                   2014-03-27
    Resolution:
    
    
    Abstract
    ========
    
    This PEP proposes adding % formatting operations similar to Python 2's ``str``
    type to ``bytes`` and ``bytearray`` [1]_ [2]_.
    
    
    Rationale
    =========
    
    While interpolation is usually thought of as a string operation, there are
    cases where interpolation on ``bytes`` or ``bytearrays`` make sense, and the
    work needed to make up for this missing functionality detracts from the overall
    readability of the code.
    
    
    Motivation
    ==========
    
    With Python 3 and the split between ``str`` and ``bytes``, one small but
    important area of programming became slightly more difficult, and much more
    painful -- wire format protocols [3]_.
    
    This area of programming is characterized by a mixture of binary data and
    ASCII compatible segments of text (aka ASCII-encoded text).  Bringing back a
    restricted %-interpolation for ``bytes`` and ``bytearray`` will aid both in
    writing new wire format code, and in porting Python 2 wire format code.
    
    Common use-cases include ``dbf`` and ``pdf`` file formats, ``email``
    formats, and ``FTP`` and ``HTTP`` communications, among many others.
    

    PEP 461 was accepted by Guido van Rossum on March 27, 2014:

    Accepted. Congrats with marshalling yet another quite contentious discussion, and putting up with my last-minute block-headedness!

    From this, we can obviously conclude that % is no longer scheduled for deprecation (as was announced with Python 3.1).