


Menyahpepijat Penyelamat! Memanfaatkan ObjWatch untuk Pemahaman Kod dan Nyahpepijat yang Cekap dalam Projek Python Kompleks
Pautan Kod Sumber
aeeeeeep
/
objwatch
?️ ObjWatch ialah perpustakaan Python untuk mengesan dan memantau atribut objek dan panggilan kaedah.
ObjTonton
[ 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.
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…
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
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.
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()
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
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Python cemerlang dalam permainan dan pembangunan GUI. 1) Pembangunan permainan menggunakan pygame, menyediakan lukisan, audio dan fungsi lain, yang sesuai untuk membuat permainan 2D. 2) Pembangunan GUI boleh memilih tkinter atau pyqt. TKInter adalah mudah dan mudah digunakan, PYQT mempunyai fungsi yang kaya dan sesuai untuk pembangunan profesional.

Python lebih mudah dipelajari dan digunakan, manakala C lebih kuat tetapi kompleks. 1. Sintaks Python adalah ringkas dan sesuai untuk pemula. Penaipan dinamik dan pengurusan memori automatik menjadikannya mudah digunakan, tetapi boleh menyebabkan kesilapan runtime. 2.C menyediakan kawalan peringkat rendah dan ciri-ciri canggih, sesuai untuk aplikasi berprestasi tinggi, tetapi mempunyai ambang pembelajaran yang tinggi dan memerlukan memori manual dan pengurusan keselamatan jenis.

Untuk memaksimumkan kecekapan pembelajaran Python dalam masa yang terhad, anda boleh menggunakan modul, masa, dan modul Python. 1. Modul DateTime digunakan untuk merakam dan merancang masa pembelajaran. 2. Modul Masa membantu menetapkan kajian dan masa rehat. 3. Modul Jadual secara automatik mengatur tugas pembelajaran mingguan.

Python lebih baik daripada C dalam kecekapan pembangunan, tetapi C lebih tinggi dalam prestasi pelaksanaan. 1. Sintaks ringkas Python dan perpustakaan yang kaya meningkatkan kecekapan pembangunan. 2. Ciri-ciri jenis kompilasi dan kawalan perkakasan meningkatkan prestasi pelaksanaan. Apabila membuat pilihan, anda perlu menimbang kelajuan pembangunan dan kecekapan pelaksanaan berdasarkan keperluan projek.

Pythonlistsarepartofthestandardlibrary, sementara

Python cemerlang dalam automasi, skrip, dan pengurusan tugas. 1) Automasi: Sandaran fail direalisasikan melalui perpustakaan standard seperti OS dan Shutil. 2) Penulisan Skrip: Gunakan Perpustakaan Psutil untuk memantau sumber sistem. 3) Pengurusan Tugas: Gunakan perpustakaan jadual untuk menjadualkan tugas. Kemudahan penggunaan Python dan sokongan perpustakaan yang kaya menjadikannya alat pilihan di kawasan ini.

Adakah cukup untuk belajar Python selama dua jam sehari? Ia bergantung pada matlamat dan kaedah pembelajaran anda. 1) Membangunkan pelan pembelajaran yang jelas, 2) Pilih sumber dan kaedah pembelajaran yang sesuai, 3) mengamalkan dan mengkaji semula dan menyatukan amalan tangan dan mengkaji semula dan menyatukan, dan anda secara beransur-ansur boleh menguasai pengetahuan asas dan fungsi lanjutan Python dalam tempoh ini.

Python dan C masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1) Python sesuai untuk pembangunan pesat dan pemprosesan data kerana sintaks ringkas dan menaip dinamik. 2) C sesuai untuk prestasi tinggi dan pengaturcaraan sistem kerana menaip statik dan pengurusan memori manual.
