Formateo de cadenas con f-Strings de Python 3

    Introducci贸n

    Python 3.6 introdujo una nueva forma de formatear cadenas: f-Strings. Es m谩s r谩pido que otros m茅todos de formateo de cadenas en Python y nos permiten evaluar expresiones de Python dentro de una cadena.

    En esta publicaci贸n, veremos las diversas formas en que podemos formatear cadenas en Python. Luego, veremos m谩s a fondo las f-Strings, y veremos c贸mo podemos usarlo al mostrar diferentes datos.

    Formato de cadena tradicional en Python

    Antes de entrar en f-Strings, echemos un vistazo a las opciones de formato de cadenas m谩s “tradicionales” disponibles en Python. Si solo desea pasar a aprender sobre f-Strings, consulte la secci贸n Formateo de cadenas con f-Strings en este art铆culo.

    Concatenaci贸n de cadenas

    La concatenaci贸n de cadenas significa que estamos combinando dos cadenas para crear una nueva. En Python, normalmente concatenamos cadenas con el + operador.

    En su int茅rprete de Python, usemos la concatenaci贸n para incluir una variable en una cadena:

    name = "Python"
    print("I like " + name + " very much!")
    

    Ver铆a el siguiente resultado:

    I like Python very much!
    

    La concatenaci贸n de cadenas solo funciona en cadenas. Si desea que se incluyan datos que no sean cadenas, debe convertirlos manualmente.

    Veamos concatenando un n煤mero con una cadena:

    age = (10 + 5) * 2
    print("You wouldn't believe me, but I am only " + age + " years old")
    

    Al ejecutar lo anterior, ver谩 este error:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate str (not "int") to str
    

    Ahora, vamos a convertir age a una String:

    age = (10 + 5) * 2
    print("You wouldn't believe me, but I am only " + str(age) + " years old")
    

    El int茅rprete mostrar铆a correctamente:

    You wouldn't believe me, but I am only 30 years old
    

    Este m茅todo no siempre es el m谩s r谩pido de evaluar para Python, ni es f谩cil para los humanos administrarlo con muchas variables. Es mejor utilizar los m茅todos de formato de cadenas dedicados de Python.

    Formato de cadena de estilo C

    El formato de cadena de estilo C, tambi茅n conocido como estilo printf, utiliza cadenas como plantillas que est谩n marcadas con % para que las variables puedan sustituirse.

    Por ejemplo, %d le dice a Python que estamos sustituyendo un n煤mero, mientras que %s le dice a Python que estamos sustituyendo una cadena.

    Tambi茅n hay algunos mecanismos de control disponibles, por ejemplo %02d asegura que el n煤mero tenga al menos 2 d铆gitos, y si no lo es, el resto se completar谩 con ceros. Podemos usar un marcador como %.4f para sustituir un decimal con exactamente 4 puntos flotantes en la cadena.

    En su int茅rprete de Python, escriba el siguiente c贸digo para que podamos ver el formato de cadena de estilo C en acci贸n:

    print('Here is an integer %02d' % 4)
    print('And a float: %.2f' % 3.141592)
    print("And a %s with %d replacements" % ("mess", 2))
    

    Tu salida deber铆a ser:

    Here is an integer 04
    And a float: 3.14
    And a mess with 2 replacements
    

    Como puede ver, con m谩s y m谩s argumentos se vuelve bastante complicado y dif铆cil de seguir. As铆 que Python lleva esto un paso m谩s all谩 y le permite usar diccionarios en % formateo.

    Aunque no es una gran mejora en su est茅tica general, podr铆a ayudar un poco en el frente de la legibilidad.

    Intente formatear una cadena de estilo C con un diccionario:

    print('Using %(dictionary)s format in C-style string formatting, here is %(num)d number to make it more interesting!' % {'dictionary': "named", "num": 1})
    

    Como puede ver, podemos especificar el nombre entre par茅ntesis entre el % y el resto del identificador.

    Su int茅rprete debe mostrar:

    Using named format in C-style string formatting, here is 1 number to make it more interesting!
    

    Si no ha pasado los 煤ltimos 42 a帽os desarrollando en C, es posible que la sintaxis anterior no sea de su agrado. Como tal, Python nos da otra opci贸n usando el format() m茅todo en cadenas.

    Funci贸n de formato Python ()

    los format() La funci贸n se comporta de manera similar al formato de estilo C, pero es mucho m谩s legible. Funciona invocando el format() m茅todo en su cadena mientras proporciona los reemplazos en la plantilla entre corchetes – {}.

    Usando su int茅rprete de Python, usaremos el format() m茅todo para formatear una cadena. Comencemos sustituyendo una cadena:

    print("This is a first {}".format("attempt!"))
    

    La salida ser谩:

    This is a first attempt!
    

    Podemos usar llaves varias veces, sustituyendo las variables en orden:

    print("And {} can add {} string too.".format("we", "more"))
    

    Salida:

    And we can add more string too.
    

    Tambi茅n podemos nombrar las variables que formateamos:

    print("String format also supports {dictionary} arguments.".format(dictionary="named"))
    

    El c贸digo anterior deber铆a imprimirse:

    String format also supports named arguments.
    

    Si bien este m茅todo es muy legible, Python es m谩s eficiente con f-Strings, al mismo tiempo que es legible. Echemos un vistazo a f-Strings m谩s de cerca.

    Formateo de cadenas con f-Strings

    Las cadenas F, o los literales de cadena formateados, tienen el prefijo f y contienen los campos de reemplazo con llaves. Se eval煤an en tiempo de ejecuci贸n, lo que las convierte en la opci贸n de formato de cadena m谩s r谩pida en Python (al menos en la implementaci贸n est谩ndar de CPython).

    Primero, verifique que tenga una versi贸n de Python 3.6 o superior:

    $ python3 --version
    Python 3.6.0
    

    Si su versi贸n de Python es inferior a 3.6, debe actualizar para utilizar esta funci贸n.

    Los literales F-String comienzan con un f, seguido de cualquier tipo de cadena (es decir, comillas simples, comillas dobles, comillas triples), puede incluir su expresi贸n de Python dentro de la cadena, entre corchetes.

    Vamos a encadenar para usar una f-String en su shell de Python:

    name = "f-String"
    print(f"hello {name}!")
    

    Y ahora ejec煤talo para ver la magia:

    hello f-String!
    

    Es muy similar a usar el format() funci贸n. Sin embargo, viene con muchas funciones que no est谩n disponibles con otros m茅todos de formato.

    Echemos un vistazo a esas caracter铆sticas, comenzando con cadenas de varias l铆neas.

    F-Strings multil铆nea

    F-Strings permite cadenas de varias l铆neas, todo lo que tiene que hacer es envolverlas entre par茅ntesis:

    name = "World"
    message = (
      f"Hello {name}. "
      "This is from a multi-lined f-string. "
      f"Have a good day, {name}"
    )
    print(message)
    

    Ver谩 esto impreso:

    Hello World. This is from a multi-lined f-string. Have a good day, World
    

    No olvide poner el f literal delante de las l铆neas que tienen reemplazos. Las sustituciones no funcionar谩n de otra manera.

    Evaluaci贸n de expresiones de Python en cadenas f

    Las f-Strings de Python le permiten hacer expresiones directamente en la propia cadena. La siguiente cadena es v谩lida:

    number = 10
    print(f"{number} + 1 = {number+1}")
    

    Y salidas:

    10 + 1 = 11
    

    Puede incluir cualquier expresi贸n v谩lida que desee, siempre que no tenga caracteres especiales. Por ejemplo, podemos tener llamadas a funciones:

    def func():
      return 42
    
    print(f"func() = {func()}")
    

    Esto devuelve:

    func() = 42
    

    Formateo de clases con cadenas f

    Puede incluir objetos creados a partir de clases en un f-String. Cada clase tiene dos m茅todos diferentes que permiten convertir un objeto en una cadena:

    • los __str__() El m茅todo de un objeto debe devolver una cadena que sea visible para el usuario y comprensible para 茅l. Eso significa que no debe tener ninguna informaci贸n secreta que deba mantenerse oculta al usuario, y no debe tener ning煤n mensaje de depuraci贸n.
    • los __repr__() El m茅todo de un objeto debe devolver una cadena m谩s detallada, posiblemente conteniendo informaci贸n de depuraci贸n.

    f-Strings llama autom谩ticamente al __str__() para el objeto que les proporcionas.

    Probemos nuestras f-Strings con una clase para verlo por nosotros mismos. Crearemos un User clase que almacena nuestro nombre y la identificaci贸n de la base de datos asociada que utiliza nuestro sistema imaginario.

    Crea un nuevo archivo llamado fstring_classes.py y agregue lo siguiente:

    # fstring_classes.py
    
    class User:
        def __init__(self, name, db_id):
            self.name = name
            self.db_id = db_id
    
        def __str__(self):
            return f"User with name: {self.name}"
    
    my_user = User("Sajjad", 12)
    print(f"{my_user}")
    

    En su Terminal, ejecute el archivo con Python:

    $ python fstring_classes.py
    

    Este programa mostrar谩:

    User with name: Sajjad
    

    Si quisi茅ramos usar un f-String con el __repr_() m茅todo de un objeto, puede poner un !r delante de su objeto siendo sustituido.

    Edite el fstring_classes.py archivo y cambie la 煤ltima l铆nea:

    print(f"{my_user}")
    

    En lo siguiente, que incluye el !r sufijo:

    print(f"{my_user!r}")
    

    Ahora podemos ejecutar este programa nuevamente:

    $ python fstring_classes.py
    

    Y nuestra salida ser谩:

    User with name: Sajjad with id 12
    

    Manejo de caracteres especiales en f-Strings

    Las cadenas F, como cualquier otra cadena de Python, admiten el uso de barras invertidas para caracteres de escape. Todos los siguientes son cadenas f v谩lidas de Python:

    print(f'escaping with \ is also possible, like: '')
    

    Ejecutar esto imprimir谩:

    escaping with  is also possible, like: '
    

    Sin embargo, hay una limitaci贸n, no podemos usar barras invertidas dentro de las llaves (la parte de expresi贸n de la cadena f). Si prueba lo siguiente en su int茅rprete de Python:

    print(f'{ord("n")}')
    

    Obtendr谩 el siguiente error:

      File "<stdin>", line 1
    SyntaxError: f-string expression part cannot include a backslash
    

    La misma limitaci贸n se aplica a las comillas del mismo tipo. El siguiente c贸digo:

    a = {"key": "value"}
    print(f"the value is {a["key"]}")
    

    Nos da este error de sintaxis:

      File "<stdin>", line 1
        print(f"the value is {a["key"]}")
                                   ^
    SyntaxError: invalid syntax
    

    Para evitar estos problemas, podemos calcularlos fuera del f-String:

    ord_newline = ord("n")
    print(f'{ord_newline}')
    

    Que imprime:

    10
    

    O podemos utilizar diferentes tipos de cotizaciones:

    a = {"key": "val"}
    print(f"The value is {a['key']}")
    

    Que muestra:

    The value is val
    

    Conclusi贸n

    En esta publicaci贸n, analizamos diferentes m茅todos de formateo de cadenas en Python, con un enfoque en el m茅todo f-String. En Python, tenemos muchas opciones, ya que podemos concatenar cadenas, usar el formato de estilo C con %, o la format() m茅todo en cadenas.

    Sin embargo, con f-Strings, obtenemos una soluci贸n legible para la que Python se ha optimizado. Aparte de sus beneficios de velocidad, hemos visto lo bien que funcionan las cadenas f para evaluar expresiones y objetos de clases.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *