Introducci贸n al m贸dulo de Python Pickle

    Introducci贸n

    Decapado es un m茅todo popular de conservaci贸n de alimentos. De acuerdo a Wikipedia, tambi茅n es un procedimiento bastante antiguo: aunque se desconocen los or铆genes del decapado, los antiguos mesopot谩micos probablemente usaron el proceso hace 4400 a帽os. Al colocar un producto en una soluci贸n espec铆fica, es posible aumentar dr谩sticamente su vida 煤til. En otras palabras, es un m茅todo que nos permite almacenar alimentos para su posterior consumo.

    Si es un desarrollador de Python, es posible que alg煤n d铆a necesite una forma de almacenar sus objetos de Python para su uso posterior. Bueno, 驴y si te dijera que tambi茅n puedes encurtir objetos Python?

    Publicaci贸n por entregas

    La serializaci贸n es un proceso de transformaci贸n de objetos o estructuras de datos en flujos de bytes o Strings. Un flujo de bytes es, bueno, un flujo de bytes: un byte se compone de 8 bits de ceros y unos. Estos flujos de bytes se pueden almacenar o transferir f谩cilmente. Esto permite a los desarrolladores guardar, por ejemplo, los datos de configuraci贸n o el progreso del usuario y luego almacenarlos (en un disco o en una base de datos) o enviarlos a otra ubicaci贸n.

    Los objetos de Python tambi茅n se pueden serializar usando un m贸dulo llamado Pepinillo.

    Una de las principales diferencias entre encurtir objetos Python y encurtir verduras es el cambio inevitable e irreversible del sabor y la textura de los alimentos encurtidos. Mientras tanto, los objetos de Python en escabeche se pueden quitar f谩cilmente a su forma original. Este proceso, por cierto, se conoce universalmente como deserializaci贸n.

    Decapado (o publicaci贸n por entregas en general) no debe confundirse con compresi贸n. El prop贸sito del decapado es traducir los datos a un formato que se pueda transferir de la RAM al disco. La compresi贸n, por otro lado, es un proceso de codificaci贸n de datos utilizando menos bits (para ahorrar espacio en disco).

    La serializaci贸n es especialmente 煤til en cualquier software en el que es importante poder guardar algo de progreso en el disco, salir del programa y luego volver a cargar el progreso despu茅s de volver a abrir el programa. Los videojuegos pueden ser el ejemplo m谩s intuitivo de la utilidad de la serializaci贸n, pero hay muchos otros programas en los que guardar y cargar el progreso o los datos de un usuario es crucial.

    Pickle vs JSON

    Existe la posibilidad de que hayas o铆do hablar JSON (JavaScript Object Notation), que es un formato popular que tambi茅n permite a los desarrolladores guardar y transmitir objetos codificados como cadenas. Este m茅todo de serializaci贸n tiene algunas ventajas sobre el decapado. El formato JSON es legible por humanos, independiente del lenguaje y m谩s r谩pido que pickle.

    Sin embargo, tambi茅n tiene algunas limitaciones importantes. Lo m谩s importante es que, de forma predeterminada, JSON solo puede representar un subconjunto limitado de tipos integrados de Python. Con Pickle, podemos serializar f谩cilmente un amplio espectro de tipos de Python y, lo que es m谩s importante, clases personalizadas. Esto significa que no necesitamos crear un esquema personalizado (como lo hacemos para JSON) y escribir serializadores y analizadores propensos a errores. Todo el trabajo pesado est谩 hecho para ti con Pickle.

    驴Qu茅 se puede encurtir y sin decapar?

    Los siguientes tipos se pueden serializar y deserializar utilizando el m贸dulo Pickle:

    • Todos los tipos de datos nativos admitidos por Python (booleanos, Ninguno, enteros, flotantes, n煤meros complejos, cadenas, bytes, matrices de bytes)
    • Diccionarios, conjuntos, listas y tuplas, siempre que contengan objetos encurtidos.
    • Funciones y clases que se definen en el nivel superior de un m贸dulo

    Es importante recordar que el decapado no es un m茅todo de serializaci贸n independiente del lenguaje, por lo tanto, los datos encurtidos solo se pueden deshacer con Python. Adem谩s, es importante asegurarse de que los objetos se conserven utilizando la misma versi贸n de Python que se utilizar谩 para eliminarlos. Mezclar versiones de Python, en este caso, puede causar muchos problemas.

    Adem谩s, las funciones se seleccionan por sus referencias de nombre y no por su valor. La salmuera resultante no contiene informaci贸n sobre el c贸digo o los atributos de la funci贸n. Por lo tanto, debe asegurarse de que el entorno en el que se elimine la funci贸n pueda importar la funci贸n. En otras palabras, si seleccionamos una funci贸n y luego la desechamos en un entorno donde no est谩 definida o no se importa, se generar谩 una excepci贸n.

    Tambi茅n es muy importante tener en cuenta que los objetos en escabeche se pueden usar de manera mal茅vola. Por ejemplo, eliminar datos de una fuente no confiable puede resultar en la ejecuci贸n de un c贸digo malicioso.

    Decapado de una lista de Python

    El siguiente ejemplo muy simple muestra los conceptos b谩sicos del uso del m贸dulo Pickle en Python 3:

    import pickle
    
    test_list = ['cucumber', 'pumpkin', 'carrot']
    
    with open('test_pickle.pkl', 'wb') as pickle_out:
        pickle.dump(test_list, pickle_out)
    

    Primero, tenemos que importar el pickle m贸dulo, que se hace en la l铆nea 1. En la l铆nea 3 definimos una lista simple de tres elementos que ser谩n decapados.

    En la l铆nea 5 indicamos que el nombre de nuestro archivo pickle de salida ser谩 test_pickle.pkl. Usando el wb opci贸n, le decimos al programa que queremos escribir (w) datos binarios (b) dentro de 茅l (porque queremos crear un flujo de bytes). Tenga en cuenta que el pkl la extensi贸n no es necesaria; la estamos usando en este tutorial porque esa es la extensi贸n incluida en la documentaci贸n de Python.

    En la l铆nea 6 usamos el pickle.dump() m茅todo para encurtir nuestra lista de prueba y almacenarla dentro del test_pickle.pkl archivo.

    Le animo a que intente abrir el archivo pickle generado en su editor de texto. Notar谩 r谩pidamente que un flujo de bytes definitivamente no es un formato legible por humanos.

    Eliminando una lista de Python

    Ahora, eliminemos el contenido del archivo pickle de prueba y devuelva nuestro objeto a su forma original.

    import pickle
    
    with open('test_pickle.pkl', 'rb') as pickle_in:
        unpickled_list = pickle.load(pickle_in)
    
    print(unpickled_list)
    

    Como puede ver, este procedimiento no es m谩s complicado que cuando encurtimos el objeto. En la l铆nea 3 abrimos nuestro test_pickle.pkl archivo de nuevo, pero esta vez nuestro objetivo es leer (r) los datos binarios (b) almacenados en su interior.

    A continuaci贸n, en la l铆nea 5, usamos el pickle.load() m茅todo para deshacer nuestra lista y almacenarla en el unpickled_list variable.

    A continuaci贸n, puede imprimir el contenido de la lista para comprobar por s铆 mismo que es id茅ntica a la lista que seleccionamos en el ejemplo anterior. Aqu铆 est谩 el resultado de ejecutar el c贸digo anterior:

    $ python unpickle.py
    ['cucumber', 'pumpkin', 'carrot']
    

    Decapado y despepitado de objetos personalizados

    Como mencion茅 antes, con Pickle, puede serializar sus propios objetos personalizados. Eche un vistazo al siguiente ejemplo:

    import pickle
    
    class Veggy():
        def __init__(self):
            self.color=""
        def set_color(self, color):
            self.color = color
    
    cucumber = Veggy()
    cucumber.set_color('green')
    
    with open('test_pickle.pkl', 'wb') as pickle_out:
        pickle.dump(cucumber, pickle_out)
    
    with open('test_pickle.pkl', 'rb') as pickle_in:
        unpickled_cucumber = pickle.load(pickle_in)
    
    print(unpickled_cucumber.color)
    

    Como puede ver, este ejemplo es casi tan simple como el anterior. Entre las l铆neas 3 y 7 definimos una clase simple que contiene un atributo y un m茅todo que cambia este atributo. En la l铆nea 9 creamos una instancia de esa clase y la almacenamos en el cucumber variable, y en la l铆nea 10 establecemos su atributo color a “verde”.

    Luego, usando exactamente las mismas funciones que en el ejemplo anterior, encurtimos y despegamos nuestro reci茅n creado cucumber objeto. Ejecutar el c贸digo anterior da como resultado el siguiente resultado:

    $ python unpickle_custom.py
    green
    

    Recuerde que solo podemos deshacer el objeto en un entorno donde la clase Veggy est谩 definido o importado. Si creamos un nuevo script e intentamos deshacer el objeto sin importar el Veggy class, obtendremos un “AttributeError”. Por ejemplo, ejecute el siguiente script:

    import pickle
    
    with open('test_pickle.pkl', 'rb') as pickle_in:
        unpickled_cucumber = pickle.load(pickle_in)
    
    print(unpickled_cucumber.color)
    

    En la salida del script anterior, ver谩 el siguiente error:

    $ python unpickle_simple.py
    Traceback (most recent call last):
      File "<pyshell#40>", line 2, in <module>
        unpickled_cucumber = pickle.load(pickle_in)
    AttributeError: Can't get attribute 'Veggy' on <module '__main__' (built-in)>
    

    Conclusi贸n

    Como puede ver, gracias al m贸dulo Pickle, la serializaci贸n de objetos Python es bastante simple. En nuestros ejemplos, seleccionamos una lista de Python simple, pero puede usar exactamente el mismo m茅todo para guardar un amplio espectro de tipos de datos de Python, siempre que se asegure de que sus objetos contengan solo otros objetos que se pueden encurtir.

    Pickling tiene algunas desventajas, la mayor de las cuales podr铆a ser el hecho de que solo puede eliminar sus datos usando Python; si necesita una soluci贸n de idiomas cruzados, JSON es definitivamente una mejor opci贸n. Y finalmente, recuerde que los pickles pueden usarse para llevar el c贸digo que no necesariamente desea ejecutar. De manera similar a la comida en escabeche, siempre que los obtenga de fuentes confiables, deber铆a estar bien.

     

    Etiquetas:

    Deja una respuesta

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