Есть ли форматированный строковый литерал в 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())