Примечание.
Операции форматирования, описанные здесь, демонстрируют различные причуды, которые приводят к ряду распространенных ошибок, таких как неправильное отображение кортежей и словарей.
Байтовые объекты bytes
/bytearray
имеют одну уникальную встроенную операцию: оператор '%'
, оператор называется по модулю. Это оператор также известен как оператор форматирования байтов или интерполяции. При заданном format % values
(где format
- это байтовая строка) спецификации преобразования % в формате заменяются нулем или более элементов значений. Этот эффект аналогичен использованию sprintf()
в языке C
.
Если формат требует одного аргумента, значение может быть одним объектом, не являющимся кортежем, в противном случае значения должны быть кортежем с точно заданным числом элементов объекта format
или одним объектом сопоставления, например словарем.
Спецификатор преобразования содержит два или более символов и содержит следующие компоненты, которые должны выполняться в следующем порядке:
'%'
, который отмечает начало спецификатора.'*'
- звездочка, фактическая ширина считывается из следующего элемента кортежа в значениях и объект для преобразования следует после минимальной ширины поля и необязательной точности.'.'
точка, за которой следует точность. Если указано как '*'
- звездочка, фактическая точность считывается из следующего элемента кортежа в значениях, а значение для преобразования следует после точности.Когда правильным аргументом является словарь или другой тип отображения, тогда форматы в байтовой строке должны включать заключенный в скобки ключ отображения в этот словарь, вставленный сразу после символа '%'
.
Например:
>>> print(b'%(language)s has %(number)03d quote types.' % ... {b'language': b"Python", b"number": 2}) # b'Python has 002 quote types.'
В этом случае никакие спецификаторы '*'
не могут появляться в формате, поскольку они требуют последовательного списка параметров.
Символы флага конверсии:
'#'
- Преобразование значения будет использовать "альтернативную форму".'0'
- Преобразование будет дополнено нулями для числовых значений.'-'
- Преобразованное значение корректируется слева, отменяет '0' преобразование, если заданы оба.' '
- пробел. Пробел должен быть оставлен перед положительным числом или пустой строкой, полученным в результате преобразования со знаком.'+'
- Знак '+'
или '-'
будет предшествовать преобразованию, заменяет флаг "пробел".Может присутствовать модификатор длины 'h'
, 'l'
или 'L'
, но он игнорируется, так как он не нужен для Python - например %ld
, идентичен %d
.
Типы конверсии:
'd'
- Десятичное число со знаком'i'
- Десятичное число со знаком'o'
- Восьмеричное значение со знаком.'0o'
перед первой цифрой.'u'
- Устаревший тип - он идентичен 'd'
.'x'
или 'X'
- Подписанный шестнадцатеричный.'0x'
или '0X'
.'e'
или 'E'
- Экспоненциальный формат с плавающей запятой.'f'
или 'F'
- Десятичный формат с плавающей точкой.'g'
или 'G'
- Формат с плавающей точкой.'c'
- Отдельный байт, принимает целочисленные или однобайтовые объекты.'b'
- Байты, любой объект, который следует за буферным протоколом или имеет __bytes__()
.N
, вывод усекается до N
символов.'s'
- является псевдонимом для 'b'
и должен использоваться только для основ кода.'a'
- Байты, преобразует любой объект Python, используя repr(obj).encode('ascii','backslashreplace')
.'r'
- является псевдонимом для 'a'
и должен использоваться только для основ кода.'%'
- Никакой аргумент не преобразуется, в результате получается '%'
символ.