examples - python string format
¿Hay un Python equivalente a la interpolación de cuerdas de Ruby? (8)
Ejemplo de rubí:
name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? /n#{name}."
La exitosa concatenación de cuerdas de Python es aparentemente detallada para mí.
Desde Python 2.6.X es posible que desee utilizar:
"my {0} string: {1}".format("cool", "Hello there!")
He desarrollado el paquete interpy , que permite la interpolación de cadenas en Python .
Solo instálalo a través de pip install interpy
. Y luego, agregue la línea # coding: interpy
al principio de sus archivos!
Ejemplo:
#!/usr/bin/env python
# coding: interpy
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? /n#{name}."
La interpolación de cadenas de Python es similar a la printf () de C
Si intentas:
name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name
La etiqueta %s
será reemplazada con la variable de name
. Debería echar un vistazo a las etiquetas de función de impresión: http://docs.python.org/library/functions.html
La interpolación de cadenas se incluirá en Python 3.6 como se especifica en PEP 498 . Podrás hacer esto:
name = ''Spongebob Squarepants''
print(f''Who lives in a Pineapple under the sea? /n{name}'')
Tenga en cuenta que odio a Bob Esponja, por lo que escribir esto fue un poco doloroso. :)
Para el antiguo Python (probado en 2.4), la solución superior señala el camino. Puedes hacerlo:
import string
def try_interp():
d = 1
f = 1.1
s = "s"
print string.Template("d: $d f: $f s: $s").substitute(**locals())
try_interp()
Y te dan
d: 1 f: 1.1 s: s
Python 3.6 agregará interpolación de cadena literal similar a la interpolación de cadena de Ruby. A partir de esa versión de Python (que está programada para ser lanzada a finales de 2016), podrá incluir expresiones en "f-strings", por ejemplo
name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")
Antes de 3.6, lo más cerca que puedes llegar a esto es
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())
El operador %
se puede usar para la interpolación de cadenas en Python. El primer operando es la cadena a ser interpolada, el segundo puede tener diferentes tipos, incluyendo un "mapeo", mapeando los nombres de los campos a los valores a interpolar. Aquí utilicé el diccionario de variables locals()
para asignar el nombre del campo a su valor como una variable local.
El mismo código que usa el método .format()
de las versiones recientes de Python se vería así:
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))
También está la clase string.Template
:
tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))
También puedes tener esto.
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? /n{name}.".format(name=name)
import inspect
def s(template, **kwargs):
"Usage: s(string, **locals())"
if not kwargs:
frame = inspect.currentframe()
try:
kwargs = frame.f_back.f_locals
finally:
del frame
if not kwargs:
kwargs = globals()
return template.format(**kwargs)
Uso:
a = 123
s(''{a}'', locals()) # print ''123''
s(''{a}'') # it is equal to the above statement: print ''123''
s(''{b}'') # raise an KeyError: b variable not found
PD: el rendimiento puede ser un problema. Esto es útil para los scripts locales, no para los registros de producción.
Duplicado