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?

Original source

Related problems