Python 3.6: f-strings: formateo de strings en python

20/09/2018 | Autor: Eduardo Enriquez

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:

 


Tags