Object Oriented Python - Serialisasi Objek
Dalam konteks penyimpanan data, serialisasi adalah proses menerjemahkan struktur data atau keadaan objek ke dalam format yang dapat disimpan (misalnya, dalam file atau buffer memori) atau dikirim dan direkonstruksi nanti.
Dalam serialisasi, suatu objek diubah menjadi format yang dapat disimpan, sehingga dapat dideserialisasi nanti dan membuat ulang objek asli dari format serial.
Acar
Pengawetan adalah proses di mana hierarki objek Python diubah menjadi aliran byte (biasanya tidak dapat dibaca manusia) untuk ditulis ke file, ini juga dikenal sebagai Serialisasi. Unpickling adalah operasi kebalikannya, di mana aliran byte diubah kembali menjadi hierarki objek Python yang berfungsi.
Pickle adalah cara paling sederhana secara operasional untuk menyimpan objek. Modul Python Pickle adalah cara berorientasi objek untuk menyimpan objek secara langsung dalam format penyimpanan khusus.
Apa yang bisa dilakukannya?
- Pickle dapat menyimpan dan mereproduksi kamus dan daftar dengan sangat mudah.
- Menyimpan atribut objek dan mengembalikannya ke keadaan yang sama.
Acar apa yang tidak bisa dilakukan?
- Itu tidak menyimpan kode objek. Hanya itu nilai atribut.
- Itu tidak dapat menyimpan pegangan file atau soket koneksi.
Singkatnya dapat kita katakan, pengawetan adalah cara untuk menyimpan dan mengambil variabel data masuk dan keluar dari file di mana variabel dapat berupa daftar, kelas, dll.
Untuk membuat acar sesuatu yang Anda harus -
- impor acar
- Tulis variabel ke file, seperti
pickle.dump(mystring, outfile, protocol),
di mana protokol argumen ke-3 adalah opsional Untuk membongkar sesuatu yang Anda harus -
Impor acar
Tulis variabel ke file, seperti
myString = pickle.load(inputfile)
Metode
Antarmuka acar menyediakan empat metode berbeda.
dump() - Metode dump () membuat serial ke file terbuka (objek seperti file).
dumps() - Membuat serial menjadi string
load() - Deserialisasi dari objek seperti terbuka.
loads() - Deserializes dari string.
Berdasarkan prosedur di atas, berikut adalah contoh "pengawetan".
Keluaran
My Cat pussy is White and has 4 legs
Would you like to see her pickled? Here she is!
b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x0e\x00\x00\x00number_of_legsq\x03K\x04X\x05\x00\x00\x00colorq\x04X\x05\x00\x00\x00Whiteq\x05ub.'
Jadi, dalam contoh di atas, kita telah membuat sebuah instance dari kelas Cat dan kemudian kita telah membuatnya menjadi acar, mengubah instance "Cat" kita menjadi array byte sederhana.
Dengan cara ini kami dapat dengan mudah menyimpan array byte pada file biner atau dalam bidang database dan mengembalikannya ke bentuk aslinya dari dukungan penyimpanan kami di lain waktu.
Juga jika Anda ingin membuat file dengan objek yang diawetkan, Anda dapat menggunakan metode dump () (sebagai ganti dumps * () * one) meneruskan juga file biner yang dibuka dan hasil pengawetan akan disimpan dalam file secara otomatis.
[….]
binary_file = open(my_pickled_Pussy.bin', mode='wb')
my_pickled_Pussy = pickle.dump(Pussy, binary_file)
binary_file.close()
Unpickling
Proses yang mengambil array biner dan mengubahnya menjadi hierarki objek disebut pembongkaran.
Proses pembongkaran dilakukan dengan menggunakan fungsi load () dari modul pickle dan mengembalikan hierarki objek lengkap dari array byte sederhana.
Mari gunakan fungsi beban dalam contoh kita sebelumnya.
Keluaran
MeOw is black
Pussy is white
JSON
JSON (JavaScript Object Notation) telah menjadi bagian dari pustaka standar Python adalah format pertukaran data yang ringan. Mudah bagi manusia untuk membaca dan menulis. Mudah untuk diurai dan dibuat.
Karena kesederhanaannya, JSON adalah cara kami menyimpan dan bertukar data, yang dicapai melalui sintaks JSON, dan digunakan di banyak aplikasi web. Karena dalam format yang dapat dibaca manusia, dan ini mungkin salah satu alasan untuk menggunakannya dalam transmisi data, selain keefektifannya saat bekerja dengan API.
Contoh data berformat JSON adalah sebagai berikut -
{"EmployID": 40203, "Name": "Zack", "Age":54, "isEmployed": True}
Python membuatnya mudah untuk bekerja dengan file Json. Modul yang disusun untuk tujuan ini adalah modul JSON. Modul ini harus disertakan (bawaan) dalam instalasi Python Anda.
Jadi mari kita lihat bagaimana kita bisa mengonversi kamus Python ke JSON dan menulisnya ke file teks.
JSON ke Python
Membaca JSON berarti mengubah JSON menjadi nilai Python (objek). Pustaka json mem-parsing JSON ke dalam kamus atau daftar dengan Python. Untuk melakukan itu, kami menggunakan fungsi load () (memuat dari string), sebagai berikut -
Keluaran
Di bawah ini adalah salah satu contoh file json,
data1.json
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
Konten di atas (Data1.json) terlihat seperti kamus konvensional. Kita dapat menggunakan acar untuk menyimpan file ini tetapi outputnya bukan dalam bentuk yang dapat dibaca manusia.
JSON (Java Script Object Notification) adalah format yang sangat sederhana dan itulah salah satu alasan popularitasnya. Sekarang mari kita lihat keluaran json melalui program di bawah ini.
Keluaran
Di atas kita membuka file json (data1.json) untuk dibaca, mendapatkan file handler dan meneruskan ke json.load dan mendapatkan kembali objeknya. Ketika kami mencoba untuk mencetak keluaran dari objek, itu sama dengan file json. Meskipun tipe objeknya adalah kamus, ia keluar sebagai objek Python. Menulis ke json sederhana seperti yang kita lihat acar ini. Di atas kami memuat file json, menambahkan pasangan nilai kunci lain dan menuliskannya kembali ke file json yang sama. Sekarang jika kita melihat data1.json, tampilannya berbeda .ie tidak dalam format yang sama seperti yang kita lihat sebelumnya.
Untuk membuat Output kami terlihat sama (format yang dapat dibaca manusia), tambahkan beberapa argumen ke baris terakhir program kami,
json.dump(conf, fh, indent = 4, separators = (‘,’, ‘: ‘))
Sama seperti acar, kita dapat mencetak string dengan dump dan memuat dengan beban. Di bawah ini adalah contohnya,
YAML
YAML mungkin adalah standar serialisasi data yang paling ramah manusia untuk semua bahasa pemrograman.
Modul Python yaml disebut pyaml
YAML adalah alternatif dari JSON -
Human readable code - YAML adalah format yang paling dapat dibaca manusia sehingga konten halaman depannya pun ditampilkan dalam YAML untuk menegaskan hal ini.
Compact code - Dalam YAML kami menggunakan indentasi spasi putih untuk menunjukkan struktur bukan tanda kurung.
Syntax for relational data - Untuk referensi internal kami menggunakan jangkar (&) dan alias (*).
One of the area where it is used widely is for viewing/editing of data structures - misalnya file konfigurasi, dumping selama debugging dan header dokumen.
Menginstal YAML
Karena yaml bukan modul bawaan, kita perlu menginstalnya secara manual. Cara terbaik untuk menginstal yaml di mesin windows adalah melalui pip. Jalankan perintah di bawah ini di terminal windows Anda untuk menginstal yaml,
pip install pyaml (Windows machine)
sudo pip install pyaml (*nix and Mac)
Saat menjalankan perintah di atas, layar akan menampilkan sesuatu seperti di bawah ini berdasarkan versi terbaru saat ini.
Collecting pyaml
Using cached pyaml-17.12.1-py2.py3-none-any.whl
Collecting PyYAML (from pyaml)
Using cached PyYAML-3.12.tar.gz
Installing collected packages: PyYAML, pyaml
Running setup.py install for PyYAML ... done
Successfully installed PyYAML-3.12 pyaml-17.12.1
Untuk mengujinya, buka shell Python dan impor modul yaml, impor yaml, jika tidak ada kesalahan yang ditemukan, maka kita dapat mengatakan instalasi berhasil.
Setelah menginstal pyaml, mari kita lihat kode di bawah ini,
script_yaml1.py
Di atas kami membuat tiga struktur data yang berbeda, kamus, daftar dan tupel. Pada setiap struktur, kami melakukan yaml.dump. Poin penting adalah bagaimana output ditampilkan di layar.
Keluaran
Keluaran kamus terlihat bersih .ie. kunci: nilai.
Ruang putih untuk memisahkan objek yang berbeda.
Daftar diberi notasi dengan tanda hubung (-)
Tuple ditunjukkan pertama kali dengan !! Python / tuple dan kemudian dalam format yang sama seperti daftar.
Memuat file yaml
Jadi katakanlah saya memiliki satu file yaml, yang berisi,
---
# An employee record
name: Raagvendra Joshi
job: Developer
skill: Oracle
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
Oracle: Elite
power_builder: Elite
Full Stack Developer: Lame
education:
4 GCSEs
3 A-Levels
MCA in something called com
Sekarang mari kita tulis kode untuk memuat file yaml ini melalui fungsi yaml.load. Di bawah ini adalah kode yang sama.
Karena hasilnya tidak terlalu mudah dibaca, saya mempercantiknya dengan menggunakan json pada akhirnya. Bandingkan output yang kami dapatkan dan file yaml aktual yang kami miliki.
Keluaran
Salah satu aspek terpenting dari pengembangan perangkat lunak adalah debugging. Di bagian ini kita akan melihat berbagai cara debug Python baik dengan debugger bawaan atau debugger pihak ketiga.
PDB - Python Debugger
Modul PDB mendukung pengaturan breakpoint. Breakpoint adalah jeda program yang disengaja, di mana Anda bisa mendapatkan lebih banyak informasi tentang status program.
Untuk mengatur breakpoint, sisipkan garis
pdb.set_trace()
Contoh
pdb_example1.py
import pdb
x = 9
y = 7
pdb.set_trace()
total = x + y
pdb.set_trace()
Kami telah memasukkan beberapa breakpoint dalam program ini. Program akan berhenti di setiap breakpoint (pdb.set_trace ()). Untuk melihat isi variabel cukup ketik nama variabel.
c:\Python\Python361>Python pdb_example1.py
> c:\Python\Python361\pdb_example1.py(8)<module>()
-> total = x + y
(Pdb) x
9
(Pdb) y
7
(Pdb) total
*** NameError: name 'total' is not defined
(Pdb)
Tekan c atau lanjutkan untuk melanjutkan eksekusi program hingga breakpoint berikutnya.
(Pdb) c
--Return--
> c:\Python\Python361\pdb_example1.py(8)<module>()->None
-> total = x + y
(Pdb) total
16
Akhirnya, Anda perlu men-debug program yang jauh lebih besar - program yang menggunakan subrutin. Dan terkadang, masalah yang Anda coba temukan terletak di dalam subrutin. Simak program berikut ini.
import pdb
def squar(x, y):
out_squared = x^2 + y^2
return out_squared
if __name__ == "__main__":
#pdb.set_trace()
print (squar(4, 5))
Sekarang menjalankan program di atas,
c:\Python\Python361>Python pdb_example2.py
> c:\Python\Python361\pdb_example2.py(10)<module>()
-> print (squar(4, 5))
(Pdb)
Kita bisa gunakan ?untuk mendapatkan bantuan, tetapi panah menunjukkan garis yang akan dieksekusi. Pada titik ini, sangat membantu untuk menekan s kes untuk melangkah ke garis itu.
(Pdb) s
--Call--
>c:\Python\Python361\pdb_example2.py(3)squar()
-> def squar(x, y):
Ini adalah panggilan ke suatu fungsi. Jika Anda ingin gambaran umum tentang posisi Anda dalam kode, coba l -
(Pdb) l
1 import pdb
2
3 def squar(x, y):
4 -> out_squared = x^2 + y^2
5
6 return out_squared
7
8 if __name__ == "__main__":
9 pdb.set_trace()
10 print (squar(4, 5))
[EOF]
(Pdb)
Anda dapat menekan n untuk maju ke baris berikutnya. Pada titik ini Anda berada di dalam metode out_squared dan Anda memiliki akses ke variabel yang dideklarasikan di dalam fungsi .ie x dan y.
(Pdb) x
4
(Pdb) y
5
(Pdb) x^2
6
(Pdb) y^2
7
(Pdb) x**2
16
(Pdb) y**2
25
(Pdb)
Jadi kita bisa melihat bahwa operator ^ bukan yang kita inginkan, melainkan kita perlu menggunakan operator ** untuk melakukan kuadrat.
Dengan cara ini kita dapat men-debug program kita di dalam fungsi / metode.
Logging
Modul logging telah menjadi bagian dari Pustaka Standar Python sejak Python versi 2.3. Karena ini adalah modul bawaan, semua modul Python dapat berpartisipasi dalam pencatatan, sehingga log aplikasi kita dapat menyertakan pesan Anda sendiri yang terintegrasi dengan pesan dari modul pihak ketiga. Ini memberikan banyak fleksibilitas dan fungsionalitas.
Manfaat Penebangan
Diagnostic logging - Ini merekam acara yang terkait dengan operasi aplikasi.
Audit logging - Ini merekam acara untuk analisis bisnis.
Pesan ditulis dan dicatat pada tingkat "keparahan" & minu
DEBUG (debug()) - Pesan diagnostik untuk pengembangan.
INFO (info()) - pesan "kemajuan" standar.
WARNING (warning()) - mendeteksi masalah yang tidak serius.
ERROR (error()) - menemui kesalahan, mungkin serius.
CRITICAL (critical()) - biasanya kesalahan fatal (program berhenti).
Mari kita lihat program sederhana di bawah ini,
import logging
logging.basicConfig(level=logging.INFO)
logging.debug('this message will be ignored') # This will not print
logging.info('This should be logged') # it'll print
logging.warning('And this, too') # It'll print
Di atas kami mencatat pesan pada tingkat keparahan. Pertama kita mengimpor modul, memanggil basicConfig dan mengatur level logging. Level yang kami tetapkan di atas adalah INFO. Kemudian kami memiliki tiga pernyataan berbeda: pernyataan debug, pernyataan info dan pernyataan peringatan.
Keluaran logging1.py
INFO:root:This should be logged
WARNING:root:And this, too
Karena pernyataan info berada di bawah pernyataan debug, kami tidak dapat melihat pesan debug. Untuk mendapatkan pernyataan debug juga di terminal Output, yang perlu kita ubah hanyalah level basicConfig.
logging.basicConfig(level = logging.DEBUG)
Dan di Keluaran kita bisa melihat,
DEBUG:root:this message will be ignored
INFO:root:This should be logged
WARNING:root:And this, too
Juga perilaku default berarti jika kita tidak menyetel level logging apa pun adalah peringatan. Cukup komentari baris kedua dari program di atas dan jalankan kodenya.
#logging.basicConfig(level = logging.DEBUG)
Keluaran
WARNING:root:And this, too
Python built in logging level sebenarnya adalah bilangan bulat.
>>> import logging
>>>
>>> logging.DEBUG
10
>>> logging.CRITICAL
50
>>> logging.WARNING
30
>>> logging.INFO
20
>>> logging.ERROR
40
>>>
Kami juga dapat menyimpan pesan log ke dalam file.
logging.basicConfig(level = logging.DEBUG, filename = 'logging.log')
Sekarang semua pesan log akan masuk ke file (logging.log) di direktori kerja Anda saat ini, bukan di layar. Ini adalah pendekatan yang jauh lebih baik karena memungkinkan kami untuk melakukan analisis posting dari pesan yang kami terima.
Kami juga dapat mengatur cap tanggal dengan pesan log kami.
logging.basicConfig(level=logging.DEBUG, format = '%(asctime)s %(levelname)s:%(message)s')
Output akan mendapatkan sesuatu seperti,
2018-03-08 19:30:00,066 DEBUG:this message will be ignored
2018-03-08 19:30:00,176 INFO:This should be logged
2018-03-08 19:30:00,201 WARNING:And this, too
Pembandingan
Pembandingan atau pembuatan profil pada dasarnya untuk menguji seberapa cepat kode Anda dijalankan dan di mana kemacetannya? Alasan utama untuk melakukan ini adalah untuk pengoptimalan.
waktu itu
Python hadir dengan modul built-in yang disebut timeit. Anda dapat menggunakannya untuk mengatur waktu potongan kode kecil. Modul timeit menggunakan fungsi waktu khusus platform sehingga Anda akan mendapatkan pengaturan waktu yang paling akurat.
Jadi, ini memungkinkan kami untuk membandingkan dua pengiriman kode yang diambil oleh masing-masing dan kemudian mengoptimalkan skrip untuk memberikan kinerja yang lebih baik.
Modul timeit memiliki antarmuka baris perintah, tetapi juga dapat diimpor.
Ada dua cara untuk memanggil skrip. Mari kita gunakan scriptnya dulu, untuk itu jalankan kode di bawah ini dan lihat Outputnya.
import timeit
print ( 'by index: ', timeit.timeit(stmt = "mydict['c']", setup = "mydict = {'a':5, 'b':10, 'c':15}", number = 1000000))
print ( 'by get: ', timeit.timeit(stmt = 'mydict.get("c")', setup = 'mydict = {"a":5, "b":10, "c":15}', number = 1000000))
Keluaran
by index: 0.1809192126703489
by get: 0.6088525265034692
Di atas kami menggunakan dua metode yang berbeda. Yaitu dengan subskrip dan mendapatkan untuk mengakses nilai kunci kamus. Kami mengeksekusi pernyataan 1 juta kali karena dijalankan terlalu cepat untuk data yang sangat kecil. Sekarang kita dapat melihat akses indeks jauh lebih cepat dibandingkan dengan get. Kita dapat menjalankan kode berkali-kali dan akan ada sedikit variasi dalam eksekusi waktu untuk mendapatkan pemahaman yang lebih baik.
Cara lain adalah dengan menjalankan tes di atas pada baris perintah. Ayo lakukan,
c:\Python\Python361>Python -m timeit -n 1000000 -s "mydict = {'a': 5, 'b':10, 'c':15}" "mydict['c']"
1000000 loops, best of 3: 0.187 usec per loop
c:\Python\Python361>Python -m timeit -n 1000000 -s "mydict = {'a': 5, 'b':10, 'c':15}" "mydict.get('c')"
1000000 loops, best of 3: 0.659 usec per loop
Output di atas dapat bervariasi berdasarkan perangkat keras sistem Anda dan semua aplikasi yang sedang berjalan di sistem Anda.
Di bawah ini kita dapat menggunakan modul timeit, jika kita ingin memanggil suatu fungsi. Karena kita dapat menambahkan beberapa pernyataan di dalam fungsi untuk diuji.
import timeit
def testme(this_dict, key):
return this_dict[key]
print (timeit.timeit("testme(mydict, key)", setup = "from __main__ import testme; mydict = {'a':9, 'b':18, 'c':27}; key = 'c'", number = 1000000))
Keluaran
0.7713474590139164