bimka
@bimka
Осваиваю Питон

Как добавить шаблон с неопределенной переменной?

Существует строка, в которую необходимо добавить значения переменных. Значения переменных содержатся в функции, на выходе которой мы получим конечную строку:

pattern = (f"Поезд {train['number']} отправляется в "
                f"{train['departure_time']} с {train['platform']} платформы, {train['way']} пути.")

def function(pattern):
    train = {
                 "number": 123,
                "departure_time": "13:40",
                "platform": 2,
                "way": 3,
               }
    return str

function(pattern)


На выходе мы получим:
"Поезд 123 отправляется в 13:40 со второй платформы, третьего пути."

Интерпретатор выдает ошибку NameError: name 'train ' is not defined. Смысл ошибки понятен, но как ее можно обойти, при условии, что на вход функции будет подаваться шаблон, а сама функция будет содержать значения переменных?
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
@Drill
В f-string в фигурных скобках должны быть уже существующие переменные либо выражения.
Использовать не f-string, а строковый темплейт и строковый метод format:

pattern = ("Поезд {number} отправляется в "
           "{departure_time} с {platform} платформы, {way} пути.")

def function(pattern):
    train = {
                 "number": 123,
                "departure_time": "13:40",
                "platform": 2,
                "way": 3,
               }
   return pattern.format(**train)

function(pattern)

>>> 
Поезд 123 отправляется в 13:40 с 2 платформы, 3 пути.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
import jinja2

pattern = "Поезд {{train['number']}} отправляется в {{train['departure_time']}} с {{train['platform']}} платформы, {{train['way']}} пути."

def function(pattern):
    train = {
                 "number": 123,
                "departure_time": "13:40",
                "platform": 2,
                "way": 3,
               }
    return jinja2.Template(pattern).render(**{'train': train})

function(pattern)
Ответ написан
Комментировать
SuperZombi
@SuperZombi
def patern(train):
    return f"Поезд {train['number']} отправляется в {train['departure_time']} с {train['platform']} платформы, {train['way']} пути."

train_A = {
    "number": 123,
    "departure_time": "13:40",
    "platform": 2,
    "way": 3
}           

pattern(train_A)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы