Найти тему
Реальный Код

Форматированные строки в Питоне (f-строки, f-strings)

Данный функционал появился в версии 3.6, и позволяет визуально улучшить оформление текстовых строк, тем самым увеличив читабельность кода.

Как было раньше:

name = 'Федя'
print('Привет, %s' % name)

На первый взгляд, все просто и понятно. Но с двумя аргументами запись уже выглядит громоздко:

print('Дата: %02d:%02d' % (day, month))

Кроме того, реальные проблемы могут начаться, когда у вас выражение чуть сложнее. Например:

module_name = 'database'
line_number = 103
error_string = 'отсутствует соединение с базой данных'
error_code = 2883
print('Ошибка в модуле %s, строка %d: %s (код ошибки %d)' % (module_name, line_number, error_string, error_code))

Выражение, опять-таки, выглядит громоздко и читается с трудом. Но вот что случится, если через пару месяцев мы решим хранить коды ошибок в строках:

module_name = 'database'
line_number = 103
error_string = 'отсутствует соединение с базой данных'
error_code = 'F-2883' # поменяли формат ошибок (был integer, стал строковый)
print('Ошибка в модуле %s, строка %d: %s (код ошибки %d)' % (module_name, line_number, error_string, error_code))

Забыв поменять тип представления переменной с %d на %s мы получили следующую ошибку:

TypeError: %d format: a number is required, not str

Еще один коварный момент кроется в том, что мы можем перепутать местами аргументы. Допустим, мы выводим логгирование ошибки с датой и временем, и случайно поменяли ошиблись в порядке аргументов:

import datetime

now = datetime.datetime.now()
module_name = 'database'
line_number = 103
error_string = 'отсутствует соединение с базой данных'
error_code = 2883
print('%04d-%02d-%02d %02d:%02d:%02d Ошибка в модуле %s, строка %d: %s (код ошибки %d)' %
(now.day, now.month, now.year, now.hour, now.minute, now.second, module_name, line_number, error_string, error_code))

Тут я “ошибся”, перепутав местами порядок следования дня, месяца и года. В итоге получаем вывод:

0017-06-2023 09:51:54 Ошибка в модуле database, строка 103: отсутствует соединение с базой данных (код ошибки 2883)

Что, естественно, является ошибкой.

Теперь рассмотри, как эти же примеры выглядят с f-строками.

name = 'Федя'

# было
print('Привет, %s' % name)

# стало
print(f'Привет, {name}')

Обратите внимание! В начале строки мы добавляем префикс ‘f’, что указывает интерпретатору, что далее следует форматированная f-строка.

day = 1
month = 2
# было
print('Дата: %02d:%02d'% (day, month))
# стало
print(f'Дата:{day:02}:{month:02}')

Стало чуть нагляднее. Но давайте взглянем на отличие в записях на нашем примере с длинной строкой с выводом ошибки в лог:

import datetime

now = datetime.datetime.now()
module_name = 'database'
line_number = 103
error_string = 'отсутствует соединение с базой данных'
error_code = 2883

# было
print('%04d-%02d-%02d %02d:%02d:%02d Ошибка в модуле %s, строка %d: %s (код ошибки %d)' %
(now.day, now.month, now.year, now.hour, now.minute, now.second, module_name, line_number, error_string, error_code))

# стало

print(f'{now.year:04}-{now.month:02}-{now.day:02} {now.hour:02}:{now.minute:02}:{now.second:02} Ошибка в модуле {module_name}, строка {line_number}: {error_string} (код ошибки {error_code})')

Теперь мы видим, какая переменная встанет в соответствующее место. Более того, нам теперь необязательно указывать тип переменной, как было раньше.

Крайне рекомендую к использованию!

#python #junior #strings

Наука
7 млн интересуются