str.format(*args, **kwargs)
Внимание! Ссылка для тех, кто ищет встроенную функцию форматирования переменных format()
.
*args
- позиционные аргументы**kwargs
- ключевые аргументыstr
, копия форматированной строкиМетод str.format()
выполняет операцию форматирования строки str
. Возвращает копию строки, в которой каждое замещающее поле заменяется строковым значением соответствующего аргумента.
Строки str
метода str.format()
содержат "замещающие поля", заключенные в фигурные скобки {}
. Все, что не содержится в фигурных скобках, считается буквальным текстом, который копируется без изменений в выходные данные. Если вам нужно включить символ скобки в буквальный текст, то это можно сделать путем удвоения фигурные скобки {{текст}}
.
Каждое замещающее поле {}
содержит либо числовой индекс позиционного аргумента, либо имя ключевого аргумента.
Грамматика для поля замены выглядит следующим образом:
"{" [ field_name] [ "!" conversion] [ ":" format_spec] "}"
# где:
# - field_name - это *args и(или) **kwargs
# - conversion - это 'r' или 's' или 'a'
# - format_spec - это Спецификация формата Mini-Language
Поле замены {...} может начинаться с field_name
, указывающего объект, значение которого должно быть отформатировано и вставлено в выходные данные вместо поля замены. За полем field_name
, необязательно должны следовать поля: conversion
, которому предшествует восклицательный знак '!'
, и format_spec
, которому предшествует двоеточие ':'
. Они задают формат замены, отличный от формата по умолчанию.
Поле field_name
Поле является либо числом, либо ключевым словом. Если это число, то оно ссылается на позиционный аргумент, а если ключевое слово, то на именованный аргумент ключевого слова.
Если в строке формата '... {0} ... {1} ... {2}'.format(a, b, c)
числа являются номерами позиционных аргументов, они все могут быть опущены, а индексы позиционных аргументов 0, 1, 2, ... будут автоматически вставлены.
# ПОЗИЦИОННЫЕ АРГУМЕНТЫ
'текст {0} текст {1} текст'.format(a, b)
# числа позиционных аргументов можно не
# указывать, если они следуют подряд
'текст {} текст {} текст'.format(a, b)
# числа позиционных аргументов следует указывать,
# если в форматируемой строке они следуют не по порядку
'текст {1} текст {0} текст {1}'.format(a, b)
# КЛЮЧЕВЫЕ АРГУМЕНТЫ
# имена ключевых аргументов указываются всегда
'текст {one} текст {two} текст {two}'.format(one=a, two=b)
Поле conversion
Поле преобразования conversion
вызывает приведение типа перед форматированием. Обычно задание форматирования значения выполняется методом __format__()
самого значения. Однако в некоторых случаях желательно принудительно форматировать тип в виде строки, переопределяя его собственное определение форматирования. При преобразовании значения в строку перед вызовом __format__()
обычная логика форматирования игнорируется.
В настоящее время поддерживаются три флага преобразования:
Поле format_spec
Cодержит спецификацию формата "Mini-Language". Эта спецификация определяет, как должно быть представлено значение, включая такие детали, как ширина поля, выравнивание, заполнение, десятичная точность и так далее. Большинство встроенных типов поддерживают спецификацию формата "Mini-Language", который описан во встроенной функции format()
.
str.format()
.Доступ к аргументам по позиции:
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
# 'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c') # 3.1+ only
# 'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
# 'c, b, a'
# распаковка позиционных аргументов
>>> '{2}, {1}, {0}'.format(*'abc')
# 'c, b, a'
# индексы аргументов могут повторятся
>>> '{0}{1}{0}'.format('abra', 'cad')
# 'abracadabra'
Доступ к аргументам по имени:
>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
# 'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
# распаковка ключевых аргументов
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
# 'Coordinates: 37.24N, -115.81W'
Доступ к атрибутам аргументов:
>>> c = (3-5j)
>>> ('The complex number {0} is formed from the real part {0.real} '
... 'and the imaginary part {0.imag}.').format(c)
# 'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
Доступ к элементам аргументов:
>>> coord = (3, 5)
>>> 'X: {0[0]}; Y: {0[1]}'.format(coord)
# 'X: 3; Y: 5'
Используем приведение типа перед форматированием на примере !r
и !s
:
>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
# "repr() shows quotes: 'test1'; str() doesn't: test2"
Выравнивание текста и указание ширины при помощи разметки спецификация формата Mini-Language:
>>> '{:<30}'.format('left aligned')
# 'left aligned '
>>> '{:>30}'.format('right aligned')
# ' right aligned'
>>> '{:^30}'.format('centered')
# ' centered '
# используем '*' как символ-заполнитель
>>> '{:*^30}'.format('centered') # use '*' as a fill char
# '***********centered***********'
Форматируем число со знаком:
>>> '{:+f}; {:+f}'.format(3.14, -3.14)
# '+3.140000; -3.140000'
# покажем пробел для положительных чисел
>>> '{: f}; {: f}'.format(3.14, -3.14)
# ' 3.140000; -3.140000'
# покажем только минус - то же, что и '{: f}; {: f}'
>>> '{:-f}; {:-f}'.format(3.14, -3.14)
# '3.140000; -3.140000'
Замена %x
и %o
и преобразование значения в разные счисления:
# Метод str.format() поддерживает двоичные числа
>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)
# 'int: 42; hex: 2a; oct: 52; bin: 101010'
# теперь с префиксами 0x, 0o или 0b:
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)
# 'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'
Использование запятой в качестве разделителя тысяч:
>>> '{:,}'.format(1234567890)
# '1,234,567,890'
Выражаем процент:
>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
# 'Correct answers: 86.36%'
Использование форматирования, зависящего от типа передаваемых данных:
>>> import datetime
>>> d = datetime.datetime(2021, 7, 3, 11, 13, 13)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
# '2021-07-03 11:13:13'