Menguasai Debugging Python: Teknik Efisien dan Praktik Terbaik
Debugging kode Python, untuk banyak dari kita, berurusan dengan menambahkan pernyataan print dan mencoba menebak apa yang sedang terjadi berdasarkan outputnya. Tidak ideal, namun dari alasan apa pun, orang tidak ingin menyentuh debugger Python.
Daftar isi
Menggunakan print untuk debugging kode
Jika Anda adalah salah satu orang yang menggunakan print untuk debugging, saya tidak menghakimi Anda. Belajar Python sulit. Pemrograman sulit. Hidup sulit. Saya mengerti bahwa belajar hal lain tampaknya melelahkan jika Anda sudah kesulitan. Dan menambahkan pernyataan print ke kode Anda… itu lebih mudah. Sebuah pengakuan kecil: Saya masih melakukannya sepanjang waktu juga. Itu tidak seburuk yang orang buat tampak.
Dengan demikian, saya akan mengajari Anda trik yang akan sama mudahnya dengan menambahkan pernyataan print ke kode Anda. Namun, trik ini memberi Anda kemampuan debugging tak terbatas dan akan memungkinkan Anda untuk memenangkan dunia, jika Anda perlu.
Mengatur breakpoint debugger Python
Anda tidak memerlukan IDE untuk debug kode Anda dengan benar. Trik ini selalu bekerja, bahkan di editor sederhana, dan bahkan di Jupyter Notebooks.
Trik ini berarti: mengatur yang disebut breakpoint menggunakan instruksi breakpoint(). Anda dapat menyisipkannya di kode Anda, tidak peduli editor atau IDE yang Anda gunakan, di titik di mana Anda biasanya menempatkan pernyataan print yang mengganggu itu.
Jadi apa yang terjadi saat Anda melakukannya? Mari kita tahu! Buat program sederhana, seperti di bawah ini:
def add_two(x): return x + 2 for i in range(1, 10): a = add_two(i) breakpoint() print(a)
Saat Anda menjalankan ini, dan tidak peduli apakah Anda melakukannya di REPL, dari command-line, atau di IDE Anda, Anda akan dimasukkan ke dalam debugger Python yang disebut PDB. Tetapi sekarang apa?
Menggunakan debugger Python
Saat saya memulai program kecil di atas, ini yang terjadi:
Ini menunjukkan file saat ini yang dimulai (breakpointing.py)
Setelah itu, ini menunjukkan perintah berikutnya yang akan dijalankan, tetapi terganggu oleh panggilan ke breakpoint().
Dan akhirnya, kita melihat prompt pdb, menunggu input kita.
Debugger Python sebenarnya adalah shell Python yang berfungsi penuh, sama seperti REPL.
Titik ini, kita dapat memeriksa lingkungan saat ini. Mari kita lihat nilai a saat ini:
(Pdb) print(a) 3 (Pdb) print(i) 1
Alih-alih print, Anda juga dapat menggunakan perintah pdb khusus p, seperti ini:
(Pdb) p a 3 (Pdb_ p i 1
Menjalankan baris berikutnya
Jadi apa jika kita ingin menjalankan baris kode berikutnya? Ada dua opsi:
Dengan s atau step, Anda mengeksekusi baris saat ini. Debugger berhenti pada kesempatan pertama yang mungkin setelah itu.
Dengan n atau next, Anda mengeksekusi baris saat ini juga tetapi sekarang debugger terus berjalan sampai baris berikutnya dari fungsi saat ini tercapai.
Untuk membuatnya lebih jelas: step dengan senang hati memasuki pemanggilan fungsi dan berhenti di dalam fungsi tersebut. Di sisi lain, next mengeksekusi fungsi sampai mengembalikan, dan berhenti di baris berikutnya.
Debugger dan IDE lainnya juga menyebut ini ‘step into’ (bukan step) dan ‘step over’ (bukan next).
Sekarang mari kita gunakan keduanya:
$ python3 breakpointing.py -> print(a) (Pdb) s 3 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) n -> breakpoint() (Pdb) n -> print(a) (Pdb) n 4 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) s --Call-- -> def add_two(x): (Pdb) s -> return x + 2 (Pdb) s --Return-- 5 -> return x + 2 (Pdb) s -> breakpoint() (Pdb)
Seperti yang Anda lihat, kita pertama kali step over pemanggilan ke add_two dengan n. Kedua kalinya, kita step into fungsi dengan s.
Perintah debugger Python
Ada lebih banyak perintah yang dapat Anda coba sendiri. Saya tidak akan menampilkan semuanya, hanya yang paling berguna:
h (help): mencetak semua perintah yang tersedia. Juga menerima argumen, misalnya h c memberitahu Anda apa yang dilakukan perintah c
c (continue): mulai berjalan sampai breakpoint berikutnya
l (list): mencetak kode sumber di sekitar baris saat ini
p: mencetak hasil dari ekspresi berikutnya. Anda dapat menggunakan ini sebagai ganti memanggil print()
pp: pretty print, berguna untuk mencetak struktur data seperti dictionary
restart: memulai ulang program saat ini
Untuk dokumentasi lengkap, kunjungi halaman debugger Python, di mana semua perintah tercantum.
Terus belajar
Meskipun ini bisa sangat berguna, lebih baik untuk menyelami debugger yang ditawarkan oleh IDE Anda. Jika Anda pengguna VSCode, saya telah menulis tutorial tentang cara debug kode Python di VSCode.