Rumah > pembangunan bahagian belakang > Tutorial Python > Menyahpepijat Penyelamat! Memanfaatkan ObjWatch untuk Pemahaman Kod dan Nyahpepijat yang Cekap dalam Projek Python Kompleks

Menyahpepijat Penyelamat! Memanfaatkan ObjWatch untuk Pemahaman Kod dan Nyahpepijat yang Cekap dalam Projek Python Kompleks

Mary-Kate Olsen
Lepaskan: 2025-01-06 02:43:41
asal
346 orang telah melayarinya

Pautan Kod Sumber

Debugging Savior! Leveraging ObjWatch for Efficient Code Comprehension and Debugging in Complex Python Projects aeeeeeep / objwatch

?️ ObjWatch ialah perpustakaan Python untuk mengesan dan memantau atribut objek dan panggilan kaedah.

ObjTonton

Debugging Savior! Leveraging ObjWatch for Efficient Code Comprehension and Debugging in Complex Python Projects Debugging Savior! Leveraging ObjWatch for Efficient Code Comprehension and Debugging in Complex Python Projects Debugging Savior! Leveraging ObjWatch for Efficient Code Comprehension and Debugging in Complex Python Projects Debugging Savior! Leveraging ObjWatch for Efficient Code Comprehension and Debugging in Complex Python Projects Debugging Savior! Leveraging ObjWatch for Efficient Code Comprehension and Debugging in Complex Python Projects

[ Bahasa Inggeris | 中文 ]

Ikhtisar

ObjWatch ialah perpustakaan Python teguh yang direka untuk menyelaraskan penyahpepijatan dan pemantauan projek yang kompleks. Dengan menawarkan pengesanan masa nyata atribut objek dan panggilan kaedah, ObjWatch memperkasakan pembangun untuk mendapatkan cerapan yang lebih mendalam tentang pangkalan kod mereka, memudahkan pengenalpastian isu, pengoptimuman prestasi dan peningkatan kualiti kod keseluruhan.

⚠️ Amaran Prestasi

ObjWatch mungkin memberi kesan kepada prestasi aplikasi anda. Adalah disyorkan untuk menggunakannya semata-mata dalam persekitaran penyahpepijatan.

Ciri

  • Pengesanan Struktur Bersarang: Visualisasikan dan pantau panggilan fungsi bersarang dan interaksi objek dengan pengelogan berhierarki yang jelas.

  • Sokongan Pengelogan Dipertingkat: Manfaatkan modul pengelogan terbina dalam Python untuk output log berstruktur dan boleh disesuaikan, termasuk sokongan untuk format ringkas dan terperinci. Selain itu, untuk memastikan log ditangkap walaupun pembalak dilumpuhkan atau dialih keluar oleh perpustakaan luaran, anda boleh menetapkan level="force". Apabila tahap ditetapkan kepada "paksa", ObjWatch memintas pengendali pembalakan standard dan menggunakan print() untuk…

Lihat di GitHub

Titik Sakit Penyahpepijatan Semasa

Apabila membaca dan menyahpepijat projek yang kompleks, adalah perkara biasa untuk menghadapi panggilan bersarang dengan sehingga sedozen lapisan, menjadikannya sukar untuk menentukan susunan pelaksanaan. Aspek yang paling mengecewakan ialah penyahpepijatan dalam persekitaran berbilang proses; penyahpepijatan satu proses sering menyebabkan proses lain menunggu dan tamat masa, memerlukan program penyahpepijatan dimulakan semula secara berterusan. Menggunakan kenyataan cetakan kerap mengakibatkan panggilan fungsi terlepas, yang memakan masa dan menyusahkan. Pada masa ini, belum ada pustaka penyahpepijatan yang menggabungkan kesederhanaan dan kelengkapan, jadi saya menghabiskan hujung minggu membangunkan alat yang menangani masalah kesakitan ini.

Apa itu ObjWatch?

ObjWatch direka khusus untuk memudahkan penyahpepijatan dan pemantauan projek yang kompleks. Ia menyediakan penjejakan masa nyata bagi sifat objek dan panggilan kaedah, serta membenarkan cangkuk tersuai untuk membantu pembangun memperoleh cerapan yang lebih mendalam tentang pangkalan kod.

Contoh Penggunaan Pantas

Anda boleh memasangnya terus menggunakan pip install objwatch. Untuk tujuan demonstrasi, anda perlu mengklonkan kod sumber:

git clone https://github.com/aeeeeeep/objwatch
cd objwatch
pip install .
python3 examples/example_usage.py
Salin selepas log masuk
Salin selepas log masuk

Melaksanakan kod di atas akan menghasilkan maklumat panggilan berikut:

[2025-01-04 19:15:13] [DEBUG] objwatch: Processed targets:
>>>>>>>>>>
examples/example_usage.py
<<<<<<<<<<
[2025-01-04 19:15:13] [WARNING] objwatch: wrapper 'BaseLogger' loaded
[2025-01-04 19:15:13] [INFO] objwatch: Starting ObjWatch tracing.
[2025-01-04 19:15:13] [INFO] objwatch: Starting tracing.
[2025-01-04 19:15:13] [DEBUG] objwatch: run main <-
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.__init__ <- '0':(type)SampleClass, '1':10
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.__init__ -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value None -> 10
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 10 -> 11
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 11 -> 12
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 12 -> 13
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 13 -> 14
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 14 -> 15
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 15 -> 14
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 14 -> 13
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass
[2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 13 -> 12
[2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None
[2025-01-04 19:15:13] [DEBUG] objwatch: end main -> None
[2025-01-04 19:15:13] [INFO] objwatch: Stopping ObjWatch tracing.
[2025-01-04 19:15:13] [INFO] objwatch: Stopping tracing.
Salin selepas log masuk

Bahagian kod yang paling penting ialah yang berikut:

# Using as a Context Manager with Detailed Logging
with objwatch.ObjWatch(['examples/example_usage.py']):
    main()

# Using the API with Simple Logging
obj_watch = objwatch.watch(['examples/example_usage.py'])
main()
obj_watch.stop()
Salin selepas log masuk

Kami boleh menggunakan alat ini melalui pengurus konteks dan melalui panggilan API. Dalam contoh, kami menentukan penjejakan untuk fail examples/example_usage.py, bermakna sebarang fungsi, kaedah atau pembolehubah dalam examples/example_usage.py akan dilog oleh alat tersebut. Pengelogan hierarki yang jelas ini membantu menggambarkan dan memantau panggilan fungsi bersarang dan interaksi objek. Log yang dicetak termasuk jenis pelaksanaan berikut:

  • run: Menunjukkan permulaan pelaksanaan fungsi atau kaedah kelas.
  • tamat: Menandakan tamatnya fungsi atau pelaksanaan kaedah kelas.
  • kemas kini: Mewakili penciptaan pembolehubah baharu.
  • apd: Menandakan penambahan elemen pada struktur data seperti senarai, set atau kamus.
  • pop: Menandai pengalihan keluar elemen daripada struktur data seperti senarai, set atau kamus.

Contohnya agak mudah, tetapi fungsi ini akan sangat berguna untuk melaksanakan projek berskala besar.

Ciri-ciri Keseluruhan

ObjWatch menyediakan antara muka berikut:

  • sasaran (senarai): Fail atau modul untuk dipantau.
  • exclude_targets (senarai, pilihan): Fail atau modul untuk dikecualikan daripada pemantauan.
  • pangkat (senarai, pilihan): Kedudukan GPU untuk dijejaki apabila menggunakan torch.distributed.
  • output (str, pilihan): Laluan ke fail untuk menulis log.
  • output_xml (str, pilihan): Laluan ke fail XML untuk menulis log berstruktur. Jika dinyatakan, maklumat pengesanan akan disimpan dalam format XML bersarang untuk penyemakan imbas dan analisis yang mudah.
  • peringkat (str, pilihan): Tahap pengelogan (cth., pengelogan.DEBUG, pengelogan.INFO, paksa dll.).
  • ringkas (bool, pilihan): Dayakan mod pengelogan ringkas dengan format "DEBUG: {msg}".
  • pembalut (FunctionWrapper, pilihan): Pembalut tersuai untuk melanjutkan fungsi pengesanan dan pengelogan.
  • with_locals (bool, pilihan): Dayakan pengesanan dan pengelogan pembolehubah setempat dalam fungsi semasa pelaksanaannya.
  • with_module_path (bool, pilihan): Kawal sama ada untuk menambah laluan modul kepada nama fungsi dalam log.

Ciri Utama: Sambungan Pembalut Tersuai

ObjWatch menyediakan kelas asas abstrak FunctionWrapper, membenarkan pengguna membuat pembungkus tersuai untuk melanjutkan dan menyesuaikan fungsi penjejakan dan pengelogan perpustakaan. Dengan mewarisi daripada FunctionWrapper, pembangun boleh melaksanakan gelagat tersuai yang disesuaikan dengan keperluan projek tertentu. Tingkah laku ini akan dilaksanakan semasa panggilan fungsi dan pemulangan, memberikan pemantauan yang lebih profesional.

Kelas FunctionWrapper

Kelas FunctionWrapper mentakrifkan dua kaedah teras yang mesti dilaksanakan:

  • wrap_call(self, func_name: str, frame: FrameType) -> str:

Kaedah ini digunakan pada permulaan panggilan fungsi. Ia menerima nama fungsi dan objek bingkai semasa, yang mengandungi konteks pelaksanaan, termasuk pembolehubah tempatan dan timbunan panggilan. Laksanakan kaedah ini untuk mengekstrak, log atau mengubah suai maklumat sebelum fungsi dilaksanakan.

  • wrap_return(self, func_name: str, result: Any) -> str:

Kaedah ini dipanggil semasa pengembalian fungsi. Ia menerima nama fungsi dan hasil yang dikembalikan oleh fungsi. Gunakan kaedah ini untuk log, menganalisis atau mengubah maklumat selepas fungsi selesai dilaksanakan.

  • wrap_upd(self, old_value: Mana-mana, current_value: Mana-mana) -> Tuple[str, str]:

Kaedah ini dicetuskan apabila pembolehubah dikemas kini, menerima nilai lama dan nilai semasa. Ia boleh digunakan untuk mengelog perubahan pada pembolehubah, membenarkan penjejakan dan penyahpepijatan peralihan keadaan berubah.

Untuk butiran lanjut tentang objek bingkai, rujuk dokumentasi rasmi Python.

TensorShapeLogger

Ini ialah contoh pembungkus tersuai yang saya laksanakan berdasarkan senario penggunaan saya. Kod tersebut terdapat dalam fail objwatch/wrappers.py. Pembalut ini secara automatik merekodkan bentuk tensor input dan output dalam semua panggilan kaedah fungsi dalam modul yang ditentukan, serta keadaan pembolehubah. Ini amat berguna untuk memahami logik pelaksanaan rangka kerja teragih yang kompleks.

git clone https://github.com/aeeeeeep/objwatch
cd objwatch
pip install .
python3 examples/example_usage.py
Salin selepas log masuk
Salin selepas log masuk

Dalam projek pembelajaran mendalam, bentuk dan dimensi tensor adalah penting. Ralat dimensi kecil boleh menghalang keseluruhan model daripada melatih atau meramal dengan betul. Memeriksa bentuk setiap tensor secara manual adalah membosankan dan mudah ralat. TensorShapeLogger mengautomasikan rakaman bentuk tensor, membantu pembangun untuk:

  • Kenal pasti isu ketidakpadanan dimensi dengan cepat: Merekod maklumat bentuk secara automatik untuk mengesan dan membetulkan ralat dimensi dengan segera.
  • Optimumkan seni bina model: Dengan menjejaki perubahan dalam bentuk tensor, optimumkan struktur rangkaian untuk meningkatkan prestasi model.
  • Tingkatkan kecekapan penyahpepijatan: Kurangkan masa yang dihabiskan untuk menyemak bentuk tensor secara manual, membenarkan tumpuan pada pembangunan model teras.

Contoh Penggunaan Pembungkus Tersuai

Adalah disyorkan untuk merujuk kepada fail tests/test_torch_train.py. Fail ini mengandungi contoh lengkap proses latihan PyTorch, menunjukkan cara mengintegrasikan ObjWatch untuk pemantauan dan pengelogan.

Nota

⚠️ Amaran Prestasi
ObjWatch boleh memberi kesan kepada prestasi program anda apabila digunakan dalam persekitaran penyahpepijatan. Oleh itu, adalah disyorkan untuk menggunakannya hanya semasa fasa nyahpepijat dan pembangunan.

Ini hanyalah penulisan awal; Saya bercadang untuk menambah lagi dari semasa ke semasa. Jika anda rasa ia berguna, sila berikan bintang.

Perpustakaan masih aktif dikemas kini. Jika anda mempunyai sebarang soalan atau cadangan, sila tinggalkan komen atau buka isu dalam repositori.

Atas ialah kandungan terperinci Menyahpepijat Penyelamat! Memanfaatkan ObjWatch untuk Pemahaman Kod dan Nyahpepijat yang Cekap dalam Projek Python Kompleks. 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