Форматирование строк с помощью именованных параметров в языке Python

Раздел: Строки -> Форматирование строк

Основы форматирования с именованными аргументами

Наиболее эффективный способ подстановки значений по имени в строку - использование метода str.format() с передачей именованных аргументов. Внутри строки указываются плейсхолдеры вида {имя}, а в вызове format каждому имени сопоставляется значение.

template = "Привет, {name}! Тебе {age} лет."
result = template.format(name="Анна", age=25)
print(result)

F строка python (f-строка в python)

Привет, Анна! Тебе 25 лет.

вывод данных в строку python (вывод данных в строку в python)

Такой подход делает код читаемым, так как порядок аргументов не важен, а имена поясняют смысл данных.

Как подставить значения из словаря?

Если данные уже хранятся в словаре, удобно распаковать его оператором **:

data = {"name": "Петр", "age": 30}
result = "Имя: {name}, возраст: {age}.".format(**data)
print(result)

Python format method (метод format для строк python)

Имя: Петр, возраст: 30.

Python текст в несколько строк (создание многострочных строк в python)

Как работать с атрибутами объектов?

В плейсхолдере можно обращаться к атрибутам и индексам. Например, для объекта точки:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(3, 4)
print("Координаты: ({p.x}, {p.y})".format(p=p))

Python f name (f-строка с именем в python)

Координаты: (3, 4)

как добавить пробел в python (добавление пробела в строку python)

Как совместить позиционные и именованные аргументы?

Метод format допускает смешанное использование. Позиционные индексы и имена не конфликтуют:

print("{0} {name} {1}".format("A", "B", name="X"))

Python format named (форматирование с именованными аргументами в python)

A X B

Типичная ошибка - забыть передать обязательный именованный аргумент. Это вызывает KeyError. Например:

try:
    "{a} {b}".format(a=1)
except KeyError as e:
    print(f"Ошибка: {e}")
Ошибка: 'b'

Решение - всегда проверять наличие всех ключей. Для словарей можно использовать format_map, который не вызывает ошибку для отсутствующих ключей, если применяется пользовательское отображение, но это отдельная тема.

Ещё одна проблема - случайное совпадение имени плейсхолдера с именем ключа, которого нет в данных. Рекомендуется использовать явные словари и логирование.

Расширенные примеры с именованными аргументами

Ниже приведены нестандартные сценарии использования именованных аргументов в форматировании.

Использование спецификаторов форматирования

Можно комбинировать имя поля с правилами выравнивания, числами и т.д.:

Пример
data = {"value": 123.456789}
template = "Число: {value:.2f} | Выровнено: {value:>10.2f}"
print(template.format(**data))
Число: 123.46 | Выровнено:     123.46

Доступ по индексу внутри последовательности

Если значение - список, можно указать индекс:

Пример
points = [(1,2), (3,4)]
print("Первая точка: {pts[0]}, вторая: {pts[1]}".format(pts=points))
Первая точка: (1, 2), вторая: (3, 4)

Работа с несколькими словарями

Можно распаковать сразу несколько словарей, если их ключи не пересекаются:

Пример
dict1 = {"a": 1}
dict2 = {"b": 2}
template = "{a} + {b} = {sum}"
result = template.format(**dict1, **dict2, sum=3)
print(result)
1 + 2 = 3

Динамическое формирование имени ключа

В f-строках (Python 3.6+) имена переменных используются напрямую, но можно применить и метод format с вычисляемым ключом:

Пример
key = "name"
value = "Ольга"
print("{{{0}}}: {0}".format(value).replace("{" + key + "}", value))  # неэлегантно, но работает

Лучше использовать f-строку:

Пример
key = "name"
value = "Ольга"
result = f"{key}: {value}"
print(result)
name: Ольга

Форматирование строк с помощью format_map

Метод str.format_map() принимает словарь и не создаёт копию, полезно для больших данных или подклассов dict:

Пример
class DefaultDict(dict):
    def __missing__(self, key):
        return f"[{key} не найден]"

d = DefaultDict(x=10)
print("{x} {y}".format_map(d))
10 [y не найден]

Именованные аргументы в f-строках с выражениями

Современный способ - f-строки. Имена переменных становятся псевдонимами:

Пример
name = "Иван"
age = 28
print(f"{name.upper()} - {age} лет")
ИВАН - 28 лет

Обратите внимание: f-строки вычисляются сразу, их нельзя отложить, в отличие от format.

Форматирование с именованными аргументами в Python - comments

En
Python format named (python)