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' # использование строки, как шаблона >>> tpl = '{0}{1}{0}' >>> tpl.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'
Что если в строке должны использоваться дополнительные фигурные скобки? Например:
# строка - шаблон >>> tpl = "Строка №{0} с {{1}-мя фигурными скобками}" # форматируем строку-шаблон >>> prn = tpl.format(1, 2) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ValueError: Single '}' encountered in format string
Чтобы форматировать строку с дополнительными фигурными скобками, необходимо эти дополнительные скобки удвоить.
# в строке - шаблоне удвоим фигурные скобки, # которые не отвечают за перенос значений переменных >>> tpl = "Строка №{0} с {{{1}-мя фигурными скобками}}" # форматируем строку-шаблон >>> tpl.format(1, 2) # 'Строка №1 с {2-мя фигурными скобками}'
!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 >>> 'Правильные ответы: {:.2%}'.format(points/total) # 'Правильные ответы: 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'