
On 3 October 2015 at 02:00, Guido van Rossum <guido@python.org> wrote:
Bingo. IMO the exact same arguments that show why f'{x} {y}' is better than '%s %s' % (x, y) applies to byte strings. It would be totally acceptable if it only took bytes (and bytearray, and memoryview) and numbers (which we can guarantee are rendered in ASCII only).
Given that restriction, what if we dropped the format() call in the bytestring case, and instead always used printf-style formatting? That is: bf'{packet_id}{chat_id}{sender_pk}{nonce}' could be roughly equivalent to (with parens to help make the pieces clearer): (b'%b' % packet_id) + (b'%b' % chat_id) + (b'%b' % sender_pk) + (b'%b' % nonce) If a ":fmt" section is provided for the substitution field, it would replace the mod-format sequence for that section: bf'{number:0.2d} ===> b'%0.2d' % number With that approach, over time, printf-style formatting (aka mod-formatting) may come to just be known as bytes formatting (even though text strings also support it). Something else that's neat with this: you could use the struct module for more complex subsections of a binary protocol, while doing the higher level composition with bf-strings*: bf'{header}{struct.pack('<10sHHb', record)}{footer}' Cheers, Nick. * which I am now tempted to call Big Friendly Strings**, since I read a lot of Roald Dahl books as a kid :) ** this would further mean that normal f-strings are friendly strings in addition to being format strings ;) -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia