Rumah > pembangunan bahagian belakang > Tutorial Python > Master Python Debugging: Teknik Pakar untuk Penyelesaian Masalah Kod yang Cekap

Master Python Debugging: Teknik Pakar untuk Penyelesaian Masalah Kod yang Cekap

Patricia Arquette
Lepaskan: 2025-01-06 01:25:44
asal
563 orang telah melayarinya

Master Python Debugging: Expert Techniques for Efficient Code Troubleshooting

Sebagai pengarang terlaris, saya menjemput anda untuk menerokai buku saya di Amazon. Jangan lupa ikuti saya di Medium dan tunjukkan sokongan anda. terima kasih! Sokongan anda bermakna dunia!

Penyahpepijat Python ialah kemahiran penting untuk pembangun, membolehkan kami mengenal pasti dan membetulkan isu dalam kod kami dengan cekap. Saya telah menghabiskan masa bertahun-tahun mengasah teknik penyahpepijatan saya, dan saya teruja untuk berkongsi beberapa kaedah paling berkesan yang saya temui.

Mari kita mulakan dengan modul pdb terbina dalam, alat yang berkuasa untuk penyahpepijatan interaktif. Saya sering menggunakan pdb untuk menjeda pelaksanaan pada titik tertentu dalam kod saya, membolehkan saya memeriksa pembolehubah dan melangkah melalui program baris demi baris. Berikut ialah contoh mudah:

import pdb

def calculate_average(numbers):
    total = sum(numbers)
    pdb.set_trace()  # Breakpoint
    average = total / len(numbers)
    return average

result = calculate_average([1, 2, 3, 4, 5])
print(result)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Apabila kod ini dijalankan, ia akan berhenti seketika pada titik putus. Saya kemudiannya boleh menggunakan arahan seperti 'n' untuk melangkah ke baris seterusnya, 'p' untuk mencetak nilai pembolehubah, atau 'c' untuk meneruskan pelaksanaan. Pendekatan interaktif ini tidak ternilai untuk memahami aliran logik yang kompleks.

Pengelogan ialah teknik lain yang sering saya gunakan, terutamanya untuk penyahpepijatan dalam persekitaran pengeluaran. Modul pengelogan Python membolehkan saya merekodkan peristiwa tertentu atau keadaan berubah-ubah tanpa mengganggu pelaksanaan program:

import logging

logging.basicConfig(level=logging.DEBUG)

def process_data(data):
    logging.debug(f"Processing data: {data}")
    result = data * 2
    logging.info(f"Processed result: {result}")
    return result

process_data(5)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pendekatan ini membantu saya menjejaki aliran data melalui aplikasi saya dan mengenal pasti tempat isu mungkin berlaku.

Untuk penyahpepijatan yang lebih maju, saya sering beralih kepada IPython. Set ciri yang kaya membolehkan pemeriksaan dan pelaksanaan kod dinamik. Begini cara saya boleh menggunakannya untuk nyahpepijat fungsi:

from IPython import embed

def complex_calculation(x, y):
    result = x * y
    embed()  # Start IPython session
    return result + 10

complex_calculation(5, 3)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini membuka cangkerang IPython pada titik panggilan embed(), membenarkan saya berinteraksi dengan skop setempat, menjalankan pengiraan tambahan dan juga mengubah suai pembolehubah dengan cepat.

Penyahpepijatan jauh telah menjadi semakin penting dalam kerja saya, terutamanya apabila berurusan dengan aplikasi yang dijalankan pada pelayan jauh atau dalam bekas. Saya sering menggunakan pdb dengan keupayaan penyahpepijatan jauh:

import pdb
import socket

class RemotePdb(pdb.Pdb):
    def __init__(self, host='localhost', port=4444):
        pdb.Pdb.__init__(self)
        self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        self.listen_socket.bind((host, port))
        self.listen_socket.listen(1)
        self.connection, address = self.listen_socket.accept()
        self.handle = self.connection.makefile('rw')
        pdb.Pdb.__init__(self, completekey='tab', stdin=self.handle, stdout=self.handle)

    def do_continue(self, arg):
        self.handle.close()
        self.connection.close()
        self.listen_socket.close()
        return pdb.Pdb.do_continue(self, arg)

RemotePdb().set_trace()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Persediaan ini membolehkan saya menyambung ke sesi penyahpepijatan pada mesin jauh, yang amat berguna untuk mendiagnosis isu dalam aplikasi yang digunakan.

Pemprofilan memori adalah penting untuk mengoptimumkan penggunaan sumber dan mengenal pasti kebocoran memori. Saya menggunakan modul memory_profiler untuk tujuan ini:

from memory_profiler import profile

@profile
def memory_intensive_function():
    large_list = [i for i in range(1000000)]
    del large_list
    return "Function completed"

memory_intensive_function()
Salin selepas log masuk
Salin selepas log masuk

Penghias ini menyediakan pecahan terperinci penggunaan memori baris demi baris, membantu saya menentukan kawasan penggunaan memori yang tinggi.

Untuk pengoptimuman prestasi, saya bergantung pada cProfile untuk mengenal pasti kesesakan dalam kod saya:

import cProfile

def slow_function():
    return sum(i * i for i in range(10000))

cProfile.run('slow_function()')
Salin selepas log masuk

Ini menjana laporan yang menunjukkan bilangan panggilan, jumlah masa dan masa setiap panggilan untuk setiap fungsi, membolehkan saya menumpukan usaha pengoptimuman saya di mana ia akan memberi impak paling besar.

Penegasan ialah alat yang berkuasa untuk menangkap ralat logik dan mengesahkan andaian dalam kod saya. Saya menggunakannya secara bebas sepanjang program saya:

import pdb

def calculate_average(numbers):
    total = sum(numbers)
    pdb.set_trace()  # Breakpoint
    average = total / len(numbers)
    return average

result = calculate_average([1, 2, 3, 4, 5])
print(result)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ketegasan membantu saya menangkap ralat pada awal proses pembangunan dan membuat andaian saya jelas.

Menyahpepijat kod serentak dan tak segerak memberikan cabaran unik. Untuk ini, saya sering menggunakan penyahpepijat asyncio:

import logging

logging.basicConfig(level=logging.DEBUG)

def process_data(data):
    logging.debug(f"Processing data: {data}")
    result = data * 2
    logging.info(f"Processed result: {result}")
    return result

process_data(5)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Untuk nyahpepijat ini, saya boleh menggunakan mod nyahpepijat asyncio:

from IPython import embed

def complex_calculation(x, y):
    result = x * y
    embed()  # Start IPython session
    return result + 10

complex_calculation(5, 3)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini membolehkan semakan tambahan dan pengelogan untuk coroutine dan gelung acara, menjadikannya lebih mudah untuk mengesan isu dalam kod tak segerak.

Apabila berurusan dengan aplikasi Python berskala besar, saya mendapati bahawa pendekatan sistematik untuk penyahpepijatan adalah penting. Saya sentiasa bermula dengan cuba menghasilkan semula isu dalam persekitaran terkawal. Ini selalunya melibatkan mencipta kes ujian minimum yang menunjukkan masalah. Sebaik sahaja saya mempunyai isu yang boleh diterbitkan semula, saya menggunakan gabungan teknik yang saya nyatakan untuk mengasingkan puncanya.

Sebagai contoh, saya mungkin bermula dengan pengelogan untuk mendapatkan gambaran keseluruhan yang luas tentang tingkah laku program, kemudian gunakan pdb untuk menetapkan titik putus di lokasi yang mencurigakan. Jika saya mengesyaki isu prestasi, saya akan menggunakan cProfile untuk mengenal pasti kesesakan. Untuk masalah yang berkaitan dengan ingatan, memory_profiler ialah alat pilihan saya.

Saya juga mendapati bahawa penyahpepijatan yang berkesan selalunya memerlukan pemahaman mendalam tentang ekosistem Python. Kebiasaan dengan perpustakaan dan rangka kerja biasa boleh menjadi tidak ternilai apabila menjejaki isu. Sebagai contoh, apabila bekerja dengan aplikasi web, saya sering terpaksa menyahpepijat isu yang berkaitan dengan pertanyaan ORM atau pengendalian permintaan HTTP. Dalam kes ini, pengetahuan tentang rangka kerja khusus (seperti Django atau Flask) adalah penting.

Teknik lain yang saya rasa berguna ialah penggunaan penyata cetakan yang bijak. Walaupun ia mungkin kelihatan kuno berbanding alat penyahpepijatan yang lebih maju, kadangkala cetakan yang diletakkan dengan baik boleh mendedahkan punca masalah dengan cepat. Walau bagaimanapun, saya sentiasa berhati-hati untuk mengalih keluar pernyataan ini sebelum melakukan kod.

Pengendalian ralat ialah satu lagi aspek kritikal penyahpepijatan. Saya memastikan untuk melaksanakan pengendalian ralat yang mantap dalam kod saya, yang bukan sahaja menjadikan aplikasi lebih berdaya tahan tetapi juga menyediakan maklumat berharga semasa menyahpepijat:

import pdb
import socket

class RemotePdb(pdb.Pdb):
    def __init__(self, host='localhost', port=4444):
        pdb.Pdb.__init__(self)
        self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        self.listen_socket.bind((host, port))
        self.listen_socket.listen(1)
        self.connection, address = self.listen_socket.accept()
        self.handle = self.connection.makefile('rw')
        pdb.Pdb.__init__(self, completekey='tab', stdin=self.handle, stdout=self.handle)

    def do_continue(self, arg):
        self.handle.close()
        self.connection.close()
        self.listen_socket.close()
        return pdb.Pdb.do_continue(self, arg)

RemotePdb().set_trace()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pendekatan ini memastikan bahawa ralat dilog dengan surih balik penuh, yang boleh menjadi tidak ternilai apabila menyahpepijat isu dalam persekitaran pengeluaran.

Saya juga mendapati nilai hebat dalam menggunakan alat penyahpepijatan yang disepadukan ke dalam IDE moden. PyCharm, misalnya, menawarkan ciri penyahpepijatan yang berkuasa termasuk titik putus bersyarat, ekspresi jam tangan dan keupayaan untuk mengubah suai kod dengan cepat semasa sesi penyahpepijatan. Alat ini boleh mempercepatkan proses penyahpepijatan dengan ketara.

Apabila berurusan dengan aplikasi berbilang benang, keadaan perlumbaan boleh menjadi sangat mencabar untuk nyahpepijat. Dalam kes ini, saya sering menggunakan pengelogan selamat benang dan penggunaan kunci dan semaphore yang berhati-hati untuk mengawal akses kepada sumber kongsi:

import pdb

def calculate_average(numbers):
    total = sum(numbers)
    pdb.set_trace()  # Breakpoint
    average = total / len(numbers)
    return average

result = calculate_average([1, 2, 3, 4, 5])
print(result)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pendekatan ini membantu memastikan output pengelogan tidak disilang dan sumber yang dikongsi diakses dengan selamat, menjadikannya lebih mudah untuk menyahpepijat isu dalam kod berbilang benang.

Teknik lain yang saya rasa berguna ialah penggunaan penghias untuk nyahpepijat. Saya sering membuat penghias tersuai untuk mencatat panggilan fungsi, mengukur masa pelaksanaan atau menangkap dan mengendalikan pengecualian tertentu:

import logging

logging.basicConfig(level=logging.DEBUG)

def process_data(data):
    logging.debug(f"Processing data: {data}")
    result = data * 2
    logging.info(f"Processed result: {result}")
    return result

process_data(5)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penghias ini merekodkan masa pelaksanaan fungsi, yang boleh membantu dalam mengenal pasti isu prestasi.

Apabila menyahpepijat isu berkaitan rangkaian, saya sering menggunakan alatan seperti Wireshark atau tcpdump untuk menangkap dan menganalisis trafik rangkaian. Ini amat berguna apabila berurusan dengan sistem atau API teragih:

from IPython import embed

def complex_calculation(x, y):
    result = x * y
    embed()  # Start IPython session
    return result + 10

complex_calculation(5, 3)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dengan menangkap trafik rangkaian semasa menjalankan kod ini, saya boleh memeriksa permintaan dan respons HTTP yang tepat, yang tidak ternilai untuk mendiagnosis isu berkaitan API.

Untuk menyahpepijat masalah berkaitan data, terutamanya apabila bekerja dengan set data yang besar, saya dapati penggunaan alat visualisasi berguna. Perpustakaan seperti matplotlib atau seaborn dengan cepat boleh mendedahkan corak atau anomali dalam data yang mungkin tidak jelas daripada melihat nombor mentah:

import pdb
import socket

class RemotePdb(pdb.Pdb):
    def __init__(self, host='localhost', port=4444):
        pdb.Pdb.__init__(self)
        self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        self.listen_socket.bind((host, port))
        self.listen_socket.listen(1)
        self.connection, address = self.listen_socket.accept()
        self.handle = self.connection.makefile('rw')
        pdb.Pdb.__init__(self, completekey='tab', stdin=self.handle, stdout=self.handle)

    def do_continue(self, arg):
        self.handle.close()
        self.connection.close()
        self.listen_socket.close()
        return pdb.Pdb.do_continue(self, arg)

RemotePdb().set_trace()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Histogram ringkas ini boleh mendedahkan dengan cepat jika pengedaran data sepadan dengan apa yang saya jangkakan, yang berpotensi menyerlahkan isu dalam pemprosesan atau penjanaan data.

Akhirnya, saya telah mengetahui bahawa penyahpepijatan yang berkesan adalah mengenai pencegahan dan juga mengenai menyelesaikan isu. Menulis kod yang jelas dan didokumentasikan dengan baik dengan liputan ujian yang baik boleh menghalang banyak pepijat daripada berlaku di tempat pertama. Saya sentiasa berusaha untuk menulis ujian unit untuk kod saya:

from memory_profiler import profile

@profile
def memory_intensive_function():
    large_list = [i for i in range(1000000)]
    del large_list
    return "Function completed"

memory_intensive_function()
Salin selepas log masuk
Salin selepas log masuk

Dengan menjalankan ujian ini dengan kerap, saya dapat menangkap regresi lebih awal dan memastikan kod saya berkelakuan seperti yang diharapkan merentas pelbagai input.

Kesimpulannya, penyahpepijatan yang berkesan dalam Python memerlukan gabungan alatan, teknik dan pengalaman. Daripada pernyataan cetakan asas kepada alat pemprofilan lanjutan, setiap kaedah mempunyai tempatnya dalam kit alat pembangun. Dengan menguasai teknik ini dan menerapkannya dengan bijak, kami boleh meningkatkan keupayaan kami untuk menulis kod Python yang mantap, cekap dan bebas ralat. Ingat, penyahpepijatan bukan hanya tentang membetulkan ralat – ia tentang memahami kod kami dengan lebih mendalam dan menambah baik amalan pembangunan kami secara berterusan.


101 Buku

101 Buku ialah syarikat penerbitan dipacu AI yang diasaskan bersama oleh pengarang Aarav Joshi. Dengan memanfaatkan teknologi AI termaju, kami memastikan kos penerbitan kami sangat rendah—sesetengah buku berharga serendah $4—menjadikan pengetahuan berkualiti boleh diakses oleh semua orang.

Lihat buku kami Kod Bersih Golang tersedia di Amazon.

Nantikan kemas kini dan berita menarik. Apabila membeli-belah untuk buku, cari Aarav Joshi untuk mencari lebih banyak tajuk kami. Gunakan pautan yang disediakan untuk menikmati diskaun istimewa!

Ciptaan Kami

Pastikan anda melihat ciptaan kami:

Pusat Pelabur | Pelabur Central Spanish | Pelabur Jerman Tengah | Hidup Pintar | Epos & Gema | Misteri Membingungkan | Hindutva | Pembangunan Elit | Sekolah JS


Kami berada di Medium

Tech Koala Insights | Dunia Epok & Gema | Medium Pusat Pelabur | Medium Misteri Membingungkan | Sains & Zaman Sederhana | Hindutva Moden

Atas ialah kandungan terperinci Master Python Debugging: Teknik Pakar untuk Penyelesaian Masalah Kod yang Cekap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan