Curs avansat de dezvoltare în Python
Capitolul
>
Nivel
Module de serializare
Modulele Marshal și Pickle
Obiectiv
Du-te la stația de service și asigură-te că datele sunt stocate corect folosind modulul JSON pentru a formata fișierele.
Continuând pe potecă, întâlnim câteva stații care monitorizează distribuția apei și calitatea solului pentru terenul care este dezvoltat pentru o recoltă viitoare. Pentru a procesa datele, este eficient să le serializăm. Deși utilizarea Json poate fi eficientă ca soluție generală, există și câteva metode de serializare specifice Python, și anume modulele Marshal și Pickle. Modulul Marshal este conceput pentru serializare/deserializare rapidă prin convertirea datelor în binar, ideal pentru transferuri de date mai simple. Modulul Pickle este mai lent, dar este proiectat pentru a procesa structuri de date mai complexe și este mult mai flexibil, ideal pentru structuri de date mai mari sau prioritare.
Pentru a utiliza modulele Marshal și Pickle, importă funcțiile lor scriind: import marshal și import pickle. În scopurile noastre, vom folosi următoarele funcții:
marshal.dumps(): Serializează datele într-un format binar, conceput pentru viteză în interiorul Python. Primește un argument, și anume datele pe care dorești să le serializezi, fiind limitat la tipuri de date de bază.marshal.loads(): Deserializează date binare în tipuri de date lizibile de Python, limitat în capabilitățile sale, dar cu execuție rapidă. Primește un argument, și anume datele de deserializat.pickle.DEFAULT_PROTOCOL: Verifică ce versiune de protocol pentru serializarea cu Pickle este implicită în versiunea ta de Python. Protocoalele influențează modul în care datele sunt serializate.pickle.HIGHEST_PROTOCOL: Verifică ce versiune de protocol pentru serializarea cu Pickle este cea mai înaltă disponibilă în versiunea ta de Python. Protocoalele influențează modul în care datele sunt serializate.pickle.dumps(): Serializează structuri de date complexe din Python într-un format binar conform protocolului utilizat. Primește două argumente: datele pe care dorești să le serializezi și versiunea protocolului pe care dorești să o folosești pentru serializare.pickle.loads(): Deserializează date binare în tipuri de date lizibile de Python, cu putere de cuprindere pentru obiecte Python. Primește un argument, și anume datele pe care dorești să le deserializezi.
În plus față de aceste module și funcții, vom folosi și un modul de formatare numit pformat, pe care îl vom importa astfel: from pprint import pformat. Acesta ne permite să folosim funcția pformat(), care poate fi folosită pentru a formata structuri de date precum dicționarele, permițându-ne să afișăm informațiile clar.
Pentru a începe, mergi la marca X luminoasă din interiorul mici stații de monitorizare și stai cu fața spre terminalul computerului. Stația monitorizează presiunea apei și condițiile solului din terenul învecinat care este dezvoltat pentru plantarea culturilor. Există o constantă numită reading, care conține date Python colectate de stație.
Creează o variabilă numită data și stochează valoarea funcției marshal.dumps() setând reading ca argument. Astfel: data = marshal.dumps(reading). Folosește variabila data cu funcția pre-scrisă display() pentru a vizualiza datele variabilei serializate.
Ieși din stație și mergi la marca X aurie, folosește funcția open() pentru a deschide ușa și a accesa biroul. Mergi la marca X luminoasă din fața terminalului și deserializează datele pe care tocmai le-ai serializat. Creează o variabilă numită output și stochează valoarea funcției marshal.loads() folosind variabila anterioară data ca argument. Folosește funcția write() și adaugă output ca argument pentru a accesa datele serializate pe care le-ai colectat de la stația de monitorizare.
Mergi la marca X luminoasă de pe covorul albastru din birou; la terminal vom verifica protocoalele pentru a determina ce tip de serializare va folosi modulul pickle la procesarea datelor. În funcția pre-scrisă write(), setează argumentele ca fiind pickle.DEFAULT_PROTOCOL și pickle.HIGHEST_PROTOCOL. Astfel vei verifica atât protocolul de serializare actual, cât și cel mai recent protocol disponibil în acest moment.
Mergi la marca X întunecată de pe covorul albastru; acum că am confirmat protocoalele, putem verifica datele stocate. Datele au fost colectate și stocate pe parcursul lunilor într-o constantă numită samples. Creează trei variabile numite: sereal_0, sereal_2 și sereal_5; le vom folosi pentru a verifica trei dintre protocoalele disponibile pentru serializare. Protocolul 0 este ASCII lizibil, nu foarte eficient; Protocolul 2 este un format binar mai eficient; iar Protocolul 5 este cel mai recent, cu cele mai complexe funcționalități adăugate.
Vom stoca valoarea funcției pickle.dumps() și vom seta ca argumente constanta samples și protocol corespunzător numărului din numele variabilei. De exemplu, pentru sereal_0 vom seta protocol la 0, astfel: sereal_0 = pickle.dumps(samples, protocol=0). Folosește sereal_0, sereal_2 și sereal_5 cu funcția pre-scrisă display() pentru a verifica cât de diferită este serializarea pentru fiecare protocol.
Mergi la marca X luminoasă de pe covorul roșu și stai cu fața spre terminal; suprascrie variabila output și stochează valoarea funcției pickle.loads(), setând argumentul la sereal_5 pentru a deserializa datele de probă colectate până acum. Folosește funcția display() și adaugă funcția pformat() cu variabila output pentru a vizualiza datele. Astfel: await player.display(pformat(output)). Notează evaluările pentru fiecare lună afișate în terminal, pentru a le înregistra ulterior.
Mergi la marca X întunecată de pe covorul roșu și stai cu fața spre birou; în funcția pre-scrisă write(), adaugă evaluările pe care le-ai notat pentru fiecare lună, afișate anterior în terminal. Adaugă-le ca șiruri de caractere încadrate în ghilimele "" în ordinea corectă, așa cum sunt prezentate în funcție, pentru a finaliza nivelul.