How can I use f-string with a variable, not with a string literal?
f-string, python, string-formatting, string-interpolation
Solution
`f"..."` strings are great when interpolating expression results into a literal, but you don't have a literal, you have a template string in a separate variable.
You can use `str.format()` to apply values to that template:
name=["deep","mahesh","nirbhay"]
user_input = "certi_{element}" # this string i ask from user
for value in name:
print(user_input.format(element=value))
String formatting placeholders that use names (such as `{element}`) are not variables. You assign a value for each name in the keyword arguments of the `str.format()` call instead. In the above example, `element=value` passes in the value of the `value` variable to fill in the placeholder with the `element`.
Unlike `f`-strings, the `{...}` placeholders are not expressions and you can't use arbitrary Python expressions in the template. This is a good thing, you wouldn't want end-users to be able to execute arbitrary Python code in your program. See the Format String Syntax documenation for details.
You can pass in any number of names; the string template doesn't have to use any of them. If you combine `str.format()` with the `**mapping` call convention, you can use any dictionary as the source of values:
template_values = {
'name': 'Ford Prefect',
'number': 42,
'company': 'Sirius Cybernetics Corporation',
'element': 'Improbability Drive',
}
print(user_input.format(**template_values)
The above would let a user use any of the names in `template_values` in their template, any number of times they like.
While you can use `locals()` and `globals()` to produce dictionaries mapping variable names to values, I'd not recommend that approach. Use a dedicated namespace like the above to limit what names are available, and document those names for your end-users.
Problem
I want to use f-string with my string variable, not with string defined with a string literal, `"..."`. Here is my code: ``` name=["deep","mahesh","nirbhay"] user_input = r"certi_{element}" # this string I ask from user for element in name: print(f"{user_input}") ``` This code gives output: ``` certi_{element} certi_{element} certi_{element} ``` But I want: ``` certi_{deep} certi_{mahesh} certi_{nirbhay} ``` How can I do this? See also: How to postpone/defer the evaluation of f-strings?