Как я могу использовать f-строку с переменной, а не со строковым литералом? - PullRequest
0 голосов
/ 24 января 2019

Я хочу использовать f-строку с моей строковой переменной, а не со строкой, определенной строковым литералом, "...".

вот мой код

name=["deep","mahesh","nirbhay"]
user_input = r"certi_{element}" # this string i ask from user  

for element in name:
    print(f"{user_input}")

Этот код даетвывод:

certi_{element}
certi_{element}
certi_{element}

Но я хочу:

certi_{deep}
certi_{mahesh}
certi_{nirbhay}

как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

f"..." строки хороши при интерполяции результатов выражения в литерал , но у вас нет литерала, у вас есть шаблон строки в отдельной переменной.

Вы можетеиспользуйте str.format(), чтобы применить значения к этому шаблону:

name=["deep","mahesh","nirbhay"]
user_input = "certi_{element}" # this string i ask from user  

for value in name:
    print(user_input.format(element=value))

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

В отличие от f -строк, заполнители {...} равны not выражений, и вы не можете использовать произвольные выражения Python в шаблоне.Это хорошо, вы не хотели бы, чтобы конечные пользователи могли выполнять произвольный код Python в вашей программе.См. Формат строки синтаксиса Документация для получения подробной информации.

Вы можете передать любое количество имен;шаблон строки не имеет для использования любого из них.Если вы объедините str.format() с соглашением о вызовах **mapping, вы можете использовать любой словарь в качестве источника значений:

template_values = {
    'name': 'Ford Prefect',
    'number': 42,
    'company': 'Sirius Cybernetics Corporation',
    'element': 'Improbability Drive',
}

print(user_input.format(**template_values)

Вышеуказанное позволит пользователю использовать любое из имен в template_values вих шаблон, сколько угодно раз.

Хотя вы можете использовать locals() и globals() для создания словарей, отображающих имена переменных в значения, я бы не рекомендовал такой подход.Используйте выделенное пространство имен, подобное приведенному выше, чтобы ограничить доступные имена и задокументировать эти имена для своих конечных пользователей.

0 голосов
/ 24 января 2019

Если вы хотите, чтобы пользователь имел доступ к вашему пространству имен, вы можете это сделать, но последствия полностью на вас.Вместо использования f-строк вы можете использовать метод format для динамической интерполяции с очень похожим синтаксисом.

Если вы хотите, чтобы пользователь имел доступ только к небольшому числуиз определенных переменных вы можете сделать что-то вроде

name=["deep", "mahesh", "nirbhay"]
user_input = "certi_{element}" # this string i ask from user  

for element in name:
    my_str = user_input.format(element=element)
    print(f"{my_str}")

Конечно, вы можете переименовать ключ, который вводит пользователь, в имя используемой вами переменной:

my_str = user_input.format(element=some_other_variable)

И вы можете простоиди и предоставь пользователю доступ ко всему твоему пространству имен (или, по крайней мере, к большей его части).Пожалуйста, не делайте этого, но имейте в виду, что вы можете:

my_str = user_input.format(**locals(), **globals())

Причина, по которой я пошел с print(f'{my_str}') вместо print(my_str), состоит в том, чтобы избежать ситуации, когда буквальные скобки обрабатываются как дальнейшие,ошибочные расширения.Например, user_input = 'certi_{{{element}}}'

...