¿Cómo puedo usar f-string con una variable, no con un literal de cadena?

Quiero usar f-string con mi variable de cadena, no con una cadena definida con un literal de cadena, "..." .

aqui esta mi codigo

 name=["deep","mahesh","nirbhay"] user_input = r"certi_{element}" # this string i ask from user for element in name: print(f"{user_input}") 

Este código da salida:

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

Pero yo quiero:

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

¿Cómo puedo hacer esto?

f"..." cadenas son excelentes cuando se interpolan resultados de expresiones en un literal , pero no tiene un literal, tiene una cadena de plantilla en una variable separada.

Puede usar str.format() para aplicar valores a esa plantilla:

 name=["deep","mahesh","nirbhay"] user_input = "certi_{element}" # this string i ask from user for value in name: print(user_input.format(element=value)) 

Los marcadores de posición de formato de cadena que usan nombres (como {element} ) no son variables . En su lugar, asigna un valor para cada nombre en los argumentos de palabras clave de la llamada str.format() . En el ejemplo anterior, element=value pasa el valor de la variable de value para completar el marcador de posición con el element .

A diferencia de las cadenas de caracteres, los marcadores de posición {...} no son expresiones y no puede utilizar expresiones de Python arbitrarias en la plantilla. Esto es algo bueno, no querría que los usuarios finales puedan ejecutar códigos Python arbitrarios en su progtwig. Consulte la documentación de syntax de cadenas de formato para obtener más información.

Puedes pasar cualquier número de nombres; La plantilla de cadena no tiene que usar ninguno de ellos. Si combina str.format() con la convención de llamadas de **mapping , puede usar cualquier diccionario como fuente de valores:

 template_values = { 'name': 'Ford Prefect', 'number': 42, 'company': 'Sirius Cybernetics Corporation', 'element': 'Improbability Drive', } print(user_input.format(**template_values) 

Lo anterior le permitiría a un usuario usar cualquiera de los nombres en los template_values de template_values en su plantilla, cuantas veces lo deseen.

Si bien puede usar locals() y globals() para producir diccionarios que asignen nombres de variables a valores, no recomendaría este enfoque. Use un espacio de nombres dedicado como el anterior para limitar los nombres disponibles y documente esos nombres para sus usuarios finales.

Si desea que el usuario tenga acceso a su espacio de nombres, puede hacerlo, pero las consecuencias son totalmente suyas. En lugar de usar f-strings, puedes usar el método de format para interpolar dinámicamente, con una syntax muy similar.

Si desea que el usuario tenga acceso solo a un pequeño número de variables específicas, puede hacer algo como

 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}") 

Por supuesto, puede cambiar el nombre de la clave que ingresa el usuario frente al nombre de variable que usa:

 my_str = user_input.format(element=some_other_variable) 

Y puede simplemente ir y dejar que el usuario tenga acceso a todo su espacio de nombres (o al menos la mayor parte de él). Por favor, no hagas esto, pero ten en cuenta que puedes:

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

La razón por la que fui con print(f'{my_str}') lugar de print(my_str) es para evitar la situación en la que las llaves literales se tratan como expansiones erróneas adicionales. Por ejemplo, user_input = 'certi_{{{element}}}'