В этой статье разберемся со способами форматирования в Python с помощью f-string. Вы узнаете, что такое f-string, как форматировать и округлять числа, создавать отступы, центрировать строки, а также как отображать объекты Python.
Что такое F-string в Python
Форматирование строк в Python претерпело долгую историю. В Python2.6 для форматирования строки использовался оператор % или модуль str.Template. Немного позже появился метод str.format, который был очень гибким и удобным инструментом (остается до сих пор).
С выходом PEP 498 под названием Literal String Interpolation ситуация изменилась. PEP 498 представил новый способ форматирования строк. Вместо вызова метода str.format теперь нужно добавить символ f перед началом объявления строки. Сравните между собой три способы форматирования в Python:
>>> text = 'world'
>>> 'Hello, %s' % text
>>> 'Hello, {}'.format(text)
>>> f'Hello, {text}'
'Hello, world'
Использование F-string с другими видами строк
В Python перед началом строки также можно использовать r (raw), b (byte), u (unicode). Однако F-string может сочетаться только с raw string (о ней мы говорили тут). Также можно писать их с большой буквы, но рекомендуется все-таки с маленькой.

Ограничения
Несмотря на то, что использование F-string очень удобно, полностью отказаться от str.format невозможно. F-string имеет доступ к локальным и глобальным переменным и выполняется в реальном времени. Таким образом, если выражение, используемое внутри {<expr>}, не может быть вычислено, интерпретатор вызовет исключение. Рассмотрите такой пример в Python:
>>> f'{name}'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined
Ошибки не возникнет, если мы воспользуемся str.format, поскольку сначала создается строка, а затем она может вызвать свои методы с нужными аргументами. Вот так выглядит пример на Python, где форматирование строки откладывается до вызова метода:
>>> s = '{name}'
>>> s.format(name='Python')
'Python'
>>> print(s)
{name}
Другой вид ограничения — невозможность использования комментариев внутри выражения F-string:
>>> f'Python is {name #name}'
File "<stdin>", line 1
SyntaxError: f-string expression part cannot include '#'
Использование F-string для отладки программы
На первых порах, вместо написания тестов, можно просто выводить на экран результаты работы программы. До появления Python3.8 многие бы писали что-то вроде hello = 58; f"hello = {hello}", но в этой конструкции много повторений.
Python3.8 имеет новые особенности. Мы можем переписать всё это выражение одной строкой f"{hello=}", которая выведет тот же результат. Кроме того, это свойство можно использовать и с функциями Python:
>>> def magic_number():
... return 58
>>> f"{magic_number() = }"
'magic_number() = 58'
Форматирование чисел в Python
Полезным применением F-string также является отображение вещественных чисел. Можно указать число с заданным количеством знаков после запятой Для этого добавляется двоеточие, точка, количество десятичных знаков и суффикс f в конце.
Например, округлим заданное число до двух знаков после запятой в Python:
>>> n = 4 / 3
>>> f'{n:.2f}'
# Целочисленное:
>>> f'{n:.0f}'
'1'
Большие числа можно форматировать в специальном в виде. Например, разделить по сотням каким-нибудь символом, например, знаком подчеркивания или запятой:
>>> big_num = 1234567890
>>> f'{big_num:_}'
'1_234_567_890'
>>> f'{big_num:,}'
'1,234,567,890'
# Указывать точность также можно:
>>> float_num = 2343552.6516251625
>>> f'{float_num:,.3f}'
'2,343,552.652
Еще можно в виде строки отображать проценты без дополнительного умножения на 100. Для этого суффикс f заменяется на знак процентов %. Точность вещественного числа также можно указать. Пример на Python для отображения процентов:
>>> p = 33 / 76
>>> p
0.4342105263157895
>>> f'Perс = {p:%}'
'Perc = 43.421053%'
>>> f'Perc = {p:.2%}'
'Perc = 43.42%'
Как форматировать даты в Python с f-string
Форматирование объектов datetime также возможно. После объекта в выражении ставится двоеточие, а затем формат вывода даты. Такая запись может использоваться вместо метода strftime, о котором говорили здесь.

>>> now = datetime.datetime.now()
>>> f'{now:%Y-%m-%d}'
'2021-01-19'
>>> f'{now:%Y-%m-%d %H:%M:%S}'
'2021-01-19 16:50:25'
Как добавить отступы в строку
Добавление отступов (пробелов) внутри строки осуществляется добавлением знака больше или меньше. Знак больше > добавит указанное количество пробелов впереди, а знак меньше < после.
Примеры кода на Python для добавления отступов внутри строки:
>>> greetings = "hello"
>>> f"He says {greetings:>10}"
'He says hello'
>>> f"He says {greetings:<10}"
'He says hello
Отступы могут быть полезны для красивого отображения:
>>> a = 1
>>> b = 21
>>> c = 321
>>> d = 4321
>>> print("\n".join((f"{a:>10}", f"{b:>10}", f"{c:>10}", f"{d:>10}")))
1
21
321
4321
Отступы могут быть заполнены не только пробелами. Можно указать какие-нибудь другие символы. Их указывают после двоеточия. Пример в Python:
>>> f"{greetings:*<10}"
'hello*****'
Кстати, помимо отступов можно центрировать строку. Для этого используется символ ^. Вот так выглядит центрирование в Python:
>>> f"{greetings:^10}"
' hello '
>>> f"{greetings:^11}"
' hello '
>>> f"{greetings:*^11}"
'***hello***'
Как форматировать объекты
Напоследок расскажем о форматировании объектов с F-string. Для отображения объектов на экран в Python вызывается метод __repr__ или __str__. Как правило, первый метод нужен для клиента, а второй — для отладки, т.е. для себя.
Допустим имеется объект Color, у которого есть атрибуты, отвечающие за красный, синий и зеленый цвета:
class Color:
def __init__(self, r=255, g=255, b=255):
self.r = r
self.g = g
self.b = b
def __str__(self) -> str:
return "A RGB color"
def __repr__(self) -> str:
return f"Color(r={self.r}, g={self.g}, b={self.b})"
Тогда простое использование объекта в f-string вызовет метод __str__, а вот добавление !r вызовет __repr__. Вот так выглядит вывод объектов Python:
>>> f"{c}"
'A RGB color'
>>> f"{c!r}"
'Color(r=123, g=32, b=255)'
Можно контролировать отображение объектов, передавая те или иные значения аргумента. Как это сказано в PEP 3101, для этого нужно определить метод __format__. Этот метод принимает аргумент format_spec, который определят вид отображения, например, с помощью условий. Пример реализации этого объекта для нашего объекта в Python может выглядеть так:
class Color:
# Те же методы, что и выше
...
def __format__(self, format_spec):
if not format_spec or format_spec == "s":
return str(self)
elif format_spec == "r":
return repr(self)
elif format_spec == "v":
return (
f"Color(r={self.r}, g={self.g}, b={self.b})"
f" - It is RGB."
)
elif format_spec == "vv":
return (
f"Color(r={self.r}, g={self.g}, b={self.b})"
f" - A more verbose nice RGB thing."
)
raise ValueError(
f"Unknown format code '{format_spec}'"
)
Теперь можем отображать объект в нужно нам виде. Передаются значения аргумента после двоеточия в f-string. Вот так выглядит передача в объект Python разных значений:
>>> c = Color(r=123, g=32, b=255)
>>> f'{c:v}'
'Color(r=123, g=32, b=255) - It is RGB.'
>>> f'{c:vv}'
'Color(r=123, g=32, b=255) - A more verbose nice RGB thing.'
>>> f'{c}'
'A RGB color'
>>> f'{c:s}'
'A RGB color'
>>> f'{c:r}'
'Color(r=123, g=32, b=255)'
>>> f'{c:j}'
ValueError: Unknown format code 'j' for object of type 'Color'
- PYML: Введение в машинное обучение на Python
- DPREP: Подготовка данных для Data Mining на Python
- PYNN: Введение в Нейронные сети на Python
А о том, как работать со строками Python, а также применять полученные знанию для решения прикладных задачи Data Science вы узнаете на наших курсах в лицензированном учебном центре обучения и повышения квалификации Data Scientist’ов и IT-специалистов в Москве.



