tutz

Mejores prácticas de formato de cadenas de Python

Python proporciona varias maneras sofisticadas para combinar tareas de procesamiento de cadenas, el formateo de cadenas nos permite realizar múltiples sustituciones especificas de tipo en una cadena en un solo paso.

Tenemos 3 maneras de formatear cadenas:

  • Operador %: '...%s...' % (values)
  • Función format: '...{}...'.format(values)
  • Interpolación de cadenas: f'...{variable}...'
  • Estilo viejo (Operador %)

    Esta forma es la más conocida ya que lleva más tiempo con nosotros. Veamos un ejemplo:

    >>> nombre = 'Edwin'
    >>> 'Hola, %s' % nombre
    "Hola, Edwin"

    Aquí podemos identificador dos partes:

    A la izquierda del operador %, se encuentra la cadena que contiene los que se va a sustituir, cada sección que se sustituirá debe empezar con un %. A la derecha del operador %, se encuentra uno o más objetos que Python usara para sustituir en la cadena de la izquierda.

    Ahora veamos más ejemplos:

    >>> 'El precio es %d %s' % (5, 'dólares')
    'El precio es 5 dólares'
    >>> '%s -- %s -- %s' % (890, 3.14159, [0, 2, 4])
    '890 -- 3.14159 -- [0, 2, 4]'

    Si nos damos cuenta, vemos que ademas de %s estamos usando %d, este último nos sirve para identificador a un decimal y así como este hay más de 10 tipos de código que podemos usar y que veremos en esta lista:

  • s: Cadena o cualquier otra cadena del tipo str(x)
  • r: Igual como s, pero usa repr() en vez de str()
  • c: Carácter, puedes ser int o str.
  • d: Decimal (entero base10)
  • i: Entero
  • o: Entero octal (base 8)
  • x: Entero hexadecimal (base 16)
  • X: Igual que x, pero con letras en mayúsculas
  • e: Punto flotante con exponente, minúsculas
  • E: Igual que e, pero usa letras mayúsculas
  • f: Punto flotante decimal
  • F: Igual que f, pero usa letras mayúsculas
  • g: Punto flotante e o f
  • G: Punto flotante E o F
  • Además de los tipos de código, Python nos permite realizar operaciones de conversión un poco más complejas. Este tipo de operaciones siguen la siguiente estructura:

    %[(keyname)][flags][width][.precision]typecode

    Aunque parezca un poco difícil vamos a ver con ejemplos cada parte de esta estructura. Ten en cuenta que las partes que estan dentro de corchetes no son obligatorias.

    Keyname

    Como vez en la estructura que hemos visto anteriormente esta parte va entre paréntesis y aquí podemos pasarle el nombre de la clave del diccionario que vamos a usar en la parte derecha.

    Por ejemplo:

    >>> 'Mi nombre es %(nombre)s %(apellido)s' % ({"nombre":"Edwin", "apellido": "Gonzales"})
    'Mi nombre es Edwin Gonzales'

    Si vemos nuevamente la estructura:

    %[(keyname)][flags][width][.precision]typecode
    %(nombre)s
    %(apellido)s

    En este ejemplo estamos usando el operador %, luego entre paréntesis el nombre de la clave que vamos a usar, en este caso nombre y apellido. Luego usamos el tipo de código, para este ejemplo usamos s.

    Flags y Width

    Vamos a ver estas dos partes para entenderlo mejor. Para los flags puedes usar los siguientes valores: '0', '-', ' ', '+' y en el caso de width puedes usar cualquier entero positivo.

    Ahora veamos ejemplos usando una combinación de estas dos partes:

    >>> 'Flag 0: %07d' % 4
    'Flag 0: 0000004'

    En este caso hemos usado el flag '0' y width 7. Con el flag '0' se agrega con ceros los valores numéricos y con width le decimos que debe tener como mínimo 7 caracteres.

    >>> 'Flag space: % 7s' % '4'
    >>> 'Flag space:       4'
    >>> 'Flag space: %-7s' % '4'
    >>> 'Flag space: 4 '

    En el primer ejemplo usamos como flag: ' ' y width: 7. En este caso el flag ' ', hace que se agregue uno o más espacios en blanco delante del valor que se sustituirá, tomando en cuenta el tamaño mínimo que en este caso es 7.

    En el segundo ejemplo usamos como flag: '-' y width: 7. En este caso el flag ' -, hace que se agregue uno o más espacios en blanco después del valor que se sustituirá, tomando en cuenta el tamaño mínimo que en este caso es 7.

    Te recomiendo que pruebes cada flag en tu terminal interactiva de Python para que puedas revisar todas las posibilidades y limitaciones que da Python en este sentido.

    Precision

    Aquí podemos establecer el número de dígitos para mostrar después de un punto decimal para números de coma flotante.

    Por ejemplo:

    >>> 'Precio: %.2f dolares' % 1.2345
    'Precio: 1.23 dolares'

    Aquí podemos ver que .2 es la precisión con la que queremos que se muestre el valor 1.2345. Así de facil podemos mostrar datos por ejemplo para un precio de algún producto o para cualquier otro uso.

    Función str.format (nuevo estilo)

    Python 3 agrego una nueva forma de formatear cadenas. Según esta nueva funcionalidad podemos formatear usando el método format() en una cadena.

    >>> 'Soy {nombre}'.format(nombre='Tutz')
    'Soy Tutz'

    Como vemos en este ejemplo se sustituye lo que esta dentro de las llaves en la parte izquierda por lo que se define dentro de la función format, en este caso se sustituir "nombre" por "Tutz".

    Otra forma de escribir es solo agregando llaves sin nada dentro, veamos un ejemplo:

    >>> '{} es mayor que {}'.format(5, 1)
    '5 es mayor que 1'

    En esta forma debemos tener en cuenta que se respeta la posición de lo que se va a sustituir, es decir, la primera llave se sustituirá con el primer valor que le pasemos a la función format(), la segunda llave con el segundo valor, y así sucesivamente.

    Existe otra forma en la que podemos combinar las dos anteriores que vimos.

    >>> '{} es mayor que {uno}'.format(5, uno=1)
    '5 es mayor que 1'

    Aquí las primeras llaves se sustituirá por el primer valor que le pasamos a format() y la llave que contiene "uno" se sustituirá por el valor de la clave uno que le pasamos a la función.

    Existe otra forma en la que le pasamos la posición del elemento que se sustituirá. Por ejemplo:

    >>> '{1} es mayor que {0}'.format(1, 5)
    >>> '5 es mayor que 1'

    Interpolación de cadenas

    En Python 3.6 se agrego un nuevo enfoque para el formateo de cadenas conocido como f-strings.Esta nueva forma nos permite incrustar expresiones de Python dentro de cadenas.

    Veamos un ejemplo simple:

    >>> nombre = 'Tutz'
    >>> f'Soy {nombre}'
    'Soy Tutz'

    Como vemos estamos usando una nueva forma que sigue la siguiente estructura, comienza con una f seguido de una cadena y dentro entre llaves las expresiones que se sustituirán.

    Así como comentamos al inicio dentro de las llaves puede ir una expresión, como por ejemplo:

    >>> a = 4
    >>> b = 7
    >>> f'La suma de a y b es { a + b }'
    'La suma de a y b es 11'

    Con esto hemos visto las diferentes maneras de formatear cadenas en Python. Ahora la pregunta es:

    ¿Que forma usamos para formatear cadenas?

    La recomendación es usar la versión #3, pero siempre y cuando uses la versión 3.6 o mayor de Python, si no es el caso, entonces usa la segunda opción. Entonces, ¿por qué enseñamos la primera versión? porque seguro lo veras en muchos ejemplos de código o en proyectos que te vayas a unir.

    En todo caso siempre es bueno aprender todo lo que nos ofrece Python :)