Форматирование строк с помощью именованных параметров в языке 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.