Есть ли форматированный строковый литерал в Python 3.6+?

Я ищу форматированный строковый литерал. В частности, что-то эквивалентное

name = "Hello"
bytes(f"Some format string {name}")

Возможно, что-то вроде fb"Some format string {name}".

Существует ли такая вещь?

Ответ 1

Нет. Идея явно отклоняется в PEP:

По той же причине, что мы не поддерживаем bytes.format(), вы можете не сочетать 'f' с 'b' строковыми литералами. Основная проблема заключается в том, что метод объекта __format__() может возвращать данные Unicode который несовместим с байтовой строкой.

Двоичные f-строки сначала потребуют решения для bytes.format(). Эта идея была предложена в прошлом, большинство недавно в PEP 461. Обсуждение такой функции обычно предложите либо

  • добавление метода, такого как __bformat__(), чтобы объект мог контролировать, как он преобразуется в байты, или

  • имеющий bytes.format(), не может быть общим или расширяемым как str.format().

Оба они остаются в качестве опций в будущем, если такая функциональность желательно.

Ответ 2

Начиная с python 3.6.2 этот процент форматирования для байтов работает для некоторых случаев использования:

print(b"Some stuff %a. Some other stuff" % my_byte_or_unicode_string)

Но как заметил комментатор:

Это не то же самое. % a (или% r) даст представление строки, а не строку сама. Например, b '% a'% b'bytes 'даст b' b'bytes '', а не b'bytes '.

Что может иметь или не иметь значения в зависимости от того, нужно ли вам просто представить отформатированную byte_or_unicode_string в пользовательском интерфейсе или если вам потенциально необходимо выполнить дальнейшие манипуляции.

Ответ 3

Это было одно из больших изменений, сделанных от python 2 до python3. Они обрабатывают unicode и строки по-разному.

Вот как вы конвертируете в байты.

string = "some string format"
string.encode()
print(string)

Вот как вы декодируете строку.

string.decode()

Я лучше оценил разницу между изменением Python 2 и 3 в unicode через эту лекцию coursera Чарльза Шевеленса. Вы можете смотреть весь 17-минутный видеоролик или быстро переходить туда примерно в 10:30, если хотите перейти к различиям между python 2 и 3 и как они обрабатывают символы и, в частности, unicode.

Я понимаю, что ваш реальный вопрос заключается в том, как вы можете форматировать строку с двумя строками и байтами.

inBytes = b"testing"
inString = 'Hello'
type(inString) #This will yield <class 'str'>
type(inBytes) #this will yield <class 'bytes'>

Здесь вы можете видеть, что у меня есть строка переменной и байтовой переменной.

Таким образом вы объедините байт и строку в одну строку.

formattedString=(inString + ' ' + inBytes.encode())