Kursus Pengembangan Python Lanjutan
Bab
>
Tingkat
Modul Serialisasi
Modul Struktur
Tujuan
Atur rincian data akhir untuk lahan pertanian baru menggunakan modul struct.
Di ujung jalan terdapat stasiun pelayanan yang mengelola lahan pertanian baru yang sudah dibangun dan tanaman yang sudah ditanam. Di sini kita akan memeriksa dan memproses data untuk tanaman yang sudah ditanam serta output yang diproyeksikan dari lahan pertanian tersebut. Seperti pada level-level lain dalam bab ini, kita akan bekerja dengan serialisasi dan deserialisasi data, dengan memperkenalkan modul terakhir yang dinamai modul struct.
Modul struct memperkenalkan serangkaian fungsi serialisasi yang mengemas data dalam format biner, tidak seperti modul-modul lain yang telah kita gunakan, Anda memiliki kontrol yang lebih besar terhadap bagaimana kita dapat menyusun data baik saat diserialisasi maupun saat dideserialisasi, menjadikannya lebih serbaguna daripada modul-modul lainnya. Gunakan import struct untuk mengakses fungsi-fungsi berikut yang akan kita gunakan untuk memproses data:
struct.calcsize(): Menentukan berapa banyak byte yang digunakan untuk mengemas string format tertentu, fungsi ini menerima satu (1) argumen yang merupakan format yang ingin Anda verifikasi ukuran byte-nya. Format yang akan kita gunakan adalah:- integer: direpresentasikan sebagai
'i'adalah format untuk data yang direpresentasikan dalam angka bulat - float: direpresentasikan sebagai
'f'adalah format untuk data yang direpresentasikan dalam angka desimal - double: direpresentasikan sebagai
'd'adalah format untuk data yang direpresentasikan dalam angka desimal yang lebih kompleks ketika format float tidak mencukupi.
- integer: direpresentasikan sebagai
struct.pack(): Menserialisasi data dalam format biner, dikemas dalam format yang Anda pilih. Fungsi ini dapat menerima dua (2) atau lebih argumen, yaitu format yang ingin Anda gunakan dan nilai-nilai yang ingin Anda serialisasikan. Format-format tersebut adalah yang telah diuraikan sebelumnya dan Anda harus menambahkannya sesuai dengan jumlah argumen yang Anda tambahkan.struct.unpack(): Mendekode data biner yang telah dikemas, menerima dua (2) argumen, format yang perlu dicocokkan dengan format saat data diserialisasikan, dan argumen kedua adalah data yang telah diserialisasikan.struct.iter_unpack(): Mendekode data biner yang telah dikemas, bekerja dengan cara yang sama sepertistruct.unpack()tetapi mengiterasi setiap blok data secara individu melalui penggunaan loop.struct.pack_into(): Versi lanjutan daristruct.pack(), menerima empat (4) argumen yang merupakan format yang ingin Anda gunakan, buffer data yang ingin Anda masukkan data ke dalamnya, posisi di buffer di mana Anda ingin data menempati, dan akhirnya data yang sedang Anda kemas.struct.unpack_from(): Versi lanjutan daristruct.unpack(), menerima tiga (3) argumen: format yang ingin Anda gunakan, buffer data yang ingin Anda unpack, dan terakhir lokasi di buffer yang ingin Anda unpack. Ini memungkinkan Anda untuk memecah bagian tertentu dari data.
Berjalanlah ke tanda X bercahaya di stasiun pelayanan dan hadapi meja, buat tiga (3) variabel bernama: integer, float dan double. Kita akan menggunakan variabel-variabel ini untuk memverifikasi ukuran dalam byte dari setiap format dengan menggunakan fungsi struct.calcsize(). Untuk variabel integer gunakan fungsi dengan 'i' sebagai argumen, untuk variabel float gunakan fungsi dengan 'f' sebagai argumen dan terakhir untuk variabel double gunakan fungsi dengan 'd' sebagai argumen. Misalnya: integer = struct.calcsize('i'). Tambahkan ketiga (3) variabel tersebut ke dalam fungsi write() yang telah disiapkan.
Berjalanlah ke tanda X emas dan gunakan fungsi read() untuk mengumpulkan data pada lahan pertanian baru, catat titik data dan format untuk penggunaan di masa depan yaitu: Resources, Size dan Estimate. Setelah Anda mencatat data ini, berjalanlah ke tanda X bercahaya di atas karpet biru dan buat sebuah variabel bernama blue_data.
Pada variabel blue_data simpan nilai dari fungsi struct.pack(), dengan menyetel sebagai argumen format dan nilai yang telah Anda catat sebelumnya. Saat menulis format, Anda harus "mengemas" tipe format ke dalam satu kesatuan. Misalnya, format integer dilabeli 'i' seperti yang telah dijelaskan sebelumnya, jika Anda menambahkan tiga tipe data integer, Anda menambahkannya sebagai 'iii'. Demikian pula, jika Anda menambahkan sebuah integer, sebuah float, dan sebuah double, itu akan ditulis sebagai 'ifd'. Saat menambahkan data, Anda meletakkannya secara individual sebagai argumen. Berikut adalah contoh keseluruhan:
data_1 = 8 # adalah sebuah integer data_2 = 2.25 # adalah sebuah float data_3 = 900.702938103 # adalah sebuah double blue_data = struct.pack('ifd', data_1, data_2, data_3)
Fungsi struct.pack() memberikan banyak fleksibilitas, memungkinkan Anda untuk mengatur bagaimana Anda ingin memformat data dan memungkinkan Anda untuk menserialisasikan beberapa titik data sekaligus, sesuai keinginan Anda. Tambahkan data yang telah dibaca sebelumnya dengan menggunakan contoh di atas sebagai dasar. Gunakan fungsi display() dengan blue_data sebagai argumen untuk melihat data yang telah dikemas.
Berjalanlah ke tanda X gelap di atas karpet biru dan hadapi terminal, buat sebuah variabel bernama blue_unpack dan simpan nilai dari fungsi struct.unpack(), dengan menambahkan format yang sama yang digunakan untuk mengemas data dan variabel blue_data sebagai argumen. Format ditulis dengan cara yang sama seperti fungsi struct.pack(), sehingga Anda dapat mendeserialisasikan data dengan cara yang sama seperti saat pertama kali Anda menserialisasikannya. Gunakan fungsi write() dengan blue_unpack sebagai argumen untuk memverifikasi data yang telah Anda kemas sebelumnya.
Di lokasi yang sama kita juga akan menggunakan fungsi struct.iter_unpack(), fungsi ini menerima argumen yang sama persis seperti struct.unpack() namun sekarang diformat sebagai loop for, ini memungkinkan kita untuk mengiterasi data daripada sekadar menuliskannya semuanya. Fungsi tersebut ditulis sebagai berikut:
for values in struct.iter_unpack(-insert value-, -insert value-): player.speak(values)
Kita akan menggunakan fungsi speak() untuk menampilkan nilai, untuk argumen yang hilang pada fungsi struct.iter_unpack(), tambahkan argumen yang sama seperti yang digunakan sebelumnya pada struct.unpack() karena ini adalah variasi dari fungsi yang sama, dari segi penggunaan.
Berjalanlah ke tanda X emas di atas karpet merah dan hadapi meja, gunakan fungsi read() untuk meninjau kuantitas tanaman. Catat semua kuantitas dan format untuk setiap tanaman. Berjalanlah ke tanda X bercahaya di atas karpet merah dan buat sebuah objek bernama buffer, dan tambahkan nilai bytearray(16). Ini adalah kumpulan byte yang bisa kita akses sebelum mengisinya, untuk keperluan kita, objek ini bekerja seperti bank data tempat Anda dapat menyimpan data secara manual. Angka 16 sebagai argumen menunjukkan panjang berapa banyak byte yang dapat disimpan dalam objek buffer.
Gunakan fungsi struct.pack_into() untuk mengisi objek buffer yang telah Anda buat. Tidak perlu membuat variabel untuk menyimpan nilai fungsi karena fungsi itu sendiri akan memasukkan nilai langsung ke dalam objek buffer. Kita akan menggunakan fungsi ini untuk setiap nilai tanaman yang telah Anda catat dan mengisi argumennya dengan nilai tersebut.
Misalnya, untuk nilai tanaman pertama yang diberikan, Anda akan mendapatkan formatnya, posisi byte-nya dan kuantitasnya. Tambahkan format untuk argumen pertama, lokasi di mana Anda ingin menserialisasikan byte, yang dalam hal ini adalah buffer. Untuk argumen ketiga atur posisi di mana Anda ingin menambahkan nilai di dalam buffer, format menentukan byte yang digunakan sehingga berhati-hatilah untuk mengemas data yang belum pernah ditempati sebelumnya. Terakhir tambahkan nilai yang ingin Anda serialisasikan dan kemas ke dalam objek buffer.
struct.pack_into('i', buffer, 0, 82)
Objek buffer memiliki 16 byte seperti yang telah disebutkan sebelumnya, dalam kode yang diberikan di atas, format integer memiliki 4 byte dan dimasukkan pada posisi 0. Ini berarti bahwa setelah data dimasukkan ke dalam buffer hanya tersisa 12 byte yang tidak terisi di dalam buffer dengan posisi 0-3 telah terisi oleh nilai yang diberikan, dalam hal ini adalah 82. Lakukan hal yang sama untuk semua titik data tanaman yang telah dibaca dan dicatat sebelumnya, totalnya ada tiga (3). Gunakan fungsi display() dan tambahkan buffer untuk menampilkan data yang telah diserialisasikan.
Berjalanlah ke tanda X gelap di atas karpet merah dan hadapi terminal, di sini kita akan mendeserialisasikan data untuk memverifikasi isinya guna memastikan penyimpanan yang benar. Buat tiga variabel bernama: lettuce, carrots dan melons, kita akan memecah data dari setiap titik data secara individual. Untuk setiap variabel simpan nilai dari struct.unpack_from() dan atur argumennya menggunakan data yang telah Anda catat untuk mengemas data tersebut. Untuk argumen pertama atur format, argumen kedua tambahkan objek buffer yang merupakan lokasi untuk memecah data, dan terakhir tambahkan posisi di dalam buffer dari mana Anda ingin memecah data. Sebagai contoh:
lettuce = struct.unpack_from('i', buffer, 0)
Data ini sesuai dengan contoh pengemasan sebelumnya yang sedang di-unpack, lakukan hal yang sama untuk dua variabel lainnya dan masukkan lettuce, carrots dan melons ke dalam fungsi write() yang telah disiapkan untuk menyelesaikan level ini.