Python 3.6: f-strings: formateo de strings en python
Para formateo de strings en python tenemos muchas opciones:
1. %-formatting
Es fácil hay ciertas combinaciones de caracteres que si estan adentro de un string python las interpreta para ser reemplazadas. El ejemplo es más claro que la explicacion:
>>> nombre = "Eduardo"
>>> "Hola, %s!" % nombre
'Hola Eduardo!'
Y si necesito llenar con muchas cosas, pasamos uan tupla:
>>> nombre = "Eduardo"
>>> edad = 35
>>> "Hola %s! Tenés %s." % (nombre, edad)
'Hola Eduardo. Tenés 35.'
Si quiero un ancho fijo o, lo que es lo mismo, llenar con espacios:
>>> '%10s' % ('test',)
" test"
2. str.format()
El format tiene una sintaxis que es mas sencilla de leer y ademas tiene un monton de pontecialidades extras:
>>> nombre = "Eduardo"
>>> "Hola {}. Tenés {}.".format(nombre, 35)
'Hola Eduardo. Tenés 35.'
Para llenar con ancho fijo:
>>> '{:>10}'.format('test')
" test"
>>> data = {'first': 'Hodor', 'last': 'Hodor!'}
>>> '{first} {last}'.format(**data)
"Hodor Hodor!"
>>> '{first} {last}'.format(first='Hodor', last='Hodor!')
"Hodor Hodor!"
>>> class Planta(object):
type = 'árbol'
tipos = [{'nombre': 'roble'}, {'nombre': 'pino'}]
>>> '{p.type}: {p.tipos[0][nombre]}'.format(p=Planta())
"árbol: roble"
Las infinitas posibilidades de format se pueden ver en esta excelente web: https://pyformat.info/
3. f-strings
Los f-strings se pueden usar a partir de python 3.6 y su especificacion esta en el pep-0498. Son más cómodos que todos los métodos anteriores. Básicamente se antepone una f a los string que van a contener "literales"
>>> nombre = "Eduardo"
>>> f"Hola {nombre}. Tenés {edad}."
'Hola Eduardo. Tenés 35.'
Como los f-strings se evalúan en tiempo de ejecución, se puede colocar dentro de ellas todas y cada una de las expresiones válidas de Python. Esto te permite hacer algunas cosas copadas:
>>> f"{2 * 37}"
'74'
>>> name = "Edu"
>>> f"{name.lower()} is divertido."
'edu is divertido'
>>> artista = {'nombre': 'Edu', 'edad': 35}
>>> f"El artista {artista['nombre']}, de edad {artista['edad']}."
"El artista Eduardo, de edad 35."
Y para el mismo ejemplo del ancho fijo:
>>> ancho = 10
>>> texto = 'edu'
>>> f'{texto: <{ancho}}'
'edu '
Estan muy buenas porque te permiten hacer operaciones inplace.
ancho = 10
precision = 4
precio = decimal.Decimal("22.34567")
print(f"result: {precio:{ancho}.{precision}}")
>>'result: 22.35'
Así son un poco más performantes que los formats tradicionales porque se resuelven en el momento directamente:
>> items = list(range(5))
>> print(items)
[0, 1, 2, 3, 4]
>> print(f'Cantidad de items: {len(items)}')
5
Funcionan hasta las lambda:
>> print(f'{(lambda x: x*3)(3)}')
'9'
Y para escapear llaves es muy simple:
>>> f"{{74}}"
'{74}'
>>> f"{{{74}}}"
'{74}'
>>> f"{{{{74}}}}"
'{{74}}'
Algunos links útiles:
- https://www.python.org/dev/peps/pep-0498/
- https://realpython.com/python-f-strings/
- https://medium.com/@NirantK/best-of-python3-6-f-strings-41f9154983e