การเชี่ยวชาญใน Monkeypatching ใน Python: คู่มือการกำหนดค่า Print Statements
การดีบักอาจรู้สึกเหมือนปริศนาที่ซับซ้อน โดยเฉพาะเมื่อคุณพยายามติดตามผลลัพธ์และเข้าใจการไหลของโปรแกรมของคุณ ปัญหาหนึ่งที่นักพัฒนา Python เผชิญคือความต้องการที่จะเพิ่มข้อมูลที่แสดงใน stderr output ของพวกเขา บล็อกโพสต์นี้จะอธิบายวิธีการใช้ monkeypatching
ใน Python เพื่อเพิ่มข้อมูลการดีบักที่มีประโยชน์ลงใน print statements ทั่วไป
ความเข้าใจปัญหา: การเพิ่มข้อมูลเอาต์พุตการดีบัก
คุณอาจต้องการแสดงข้อความที่มีข้อมูลมากขึ้นไปยัง stderr เช่น ถ้าคุณกำลังดีบักฟังก์ชันและต้องการจะแสดงตำแหน่งของการเรียก (ชื่อไฟล์และหมายเลขบรรทัด) การมี print statements ที่กำหนดเองสามารถช่วยปรับปรุงการติดตามได้มาก
คุณอาจพบว่าตัวเองต้องต่อสู้กับการตรวจสอบข้อมูลใน Python เพื่อดึงชื่อฟังก์ชันและหมายเลขบรรทัด โดยมีโค้ดดังนี้:
name = sys._getframe(1).f_code
name = "%s:%d %s()" % (os.path.split(name.co_filename)[1], name.co_firstlineno, name.co_name)
ซึ่งผลลัพธ์จะเป็นสตริงที่สวยงามเช่นนี้:
foo.py:22 bar() blah blah
คำถามสำคัญ
เป็นไปได้ไหมที่จะเปลี่ยนพฤติกรรมของ print statements ทั่วทั้ง Python เพื่อรวมบริบทประเภทนี้?
แนวทางแก้ไข: การใช้ Monkeypatching
ใช่ คุณสามารถทำสิ่งนี้ได้โดยใช้เทคนิคที่เรียกว่า monkeypatching ใน Python, monkeypatching
หมายถึงการแก้ไขหรือขยายพฤติกรรมของไลบรารีหรือคลาสในระหว่างการทำงาน ในกรณีของเรา เราจะทำการแทนที่ sys.stdout
เพื่อปรับแต่งวิธีที่ทำงานของ print statements
คู่มือทีละขั้นตอนในการ Monkeypatching Print Statements
นี่คือวิธีง่ายๆ และมีประสิทธิภาพในการเพิ่มข้อมูลที่กำหนดเองของคุณไปยัง print statements ทุกคำสั่ง:
-
นำเข้าโมดูลที่จำเป็น
เริ่มต้นด้วยการนำเข้าโมดูลที่จำเป็น:import sys import os
-
สร้างคลาส Print ที่กำหนดเอง
สร้างคลาสใหม่ที่จัดการพฤติกรรมการพิมพ์ของคุณ:class CustomPrint: def write(self, message): # รับข้อมูลเฟรมปัจจุบันเพื่อดึงตำแหน่งการเรียก frame = sys._getframe(1) code = frame.f_code location = "%s:%d %s() " % (os.path.split(code.co_filename)[1], frame.f_lineno, code.co_name) # เพิ่มข้อมูลตำแหน่งไปยังข้อความ sys.stdout.write(location + message) def flush(self): pass # จำเป็นต้องมีเพื่อความเข้ากันได้กับสตรีมที่ล้างได้
-
แทนที่ sys.stdout
เปลี่ยนsys.stdout
ด้วยอินสแตนซ์CustomPrint
ใหม่ของคุณ:sys.stdout = CustomPrint()
การใช้งานตัวอย่าง
ตอนนี้ทุกครั้งที่คุณใช้ฟังก์ชัน print มันจะเพิ่มข้อมูลการดีบักไปยังผลลัพธ์โดยอัตโนมัติ ตัวอย่างเช่น:
print("นี่คือข้อความทดสอบ.")
จะให้ผลลัพธ์ประมาณนี้:
foo.py:22 <module> นี่คือข้อความทดสอบ.
ด้วยวิธีนี้ ทุกคำสั่ง print จะมีหมายเลขไฟล์และบรรทัดร่วมกับข้อความของคุณ ซึ่งสามารถเป็นประโยชน์อย่างยิ่งในระหว่างกระบวนการดีบัก
สรุป
การใช้ monkeypatching เพื่อปรับแต่ง print statements สามารถเปลี่ยนแปลงวิธีการที่คุณรวบรวมข้อมูลการดีบัก โดยการเปลี่ยนแปลงพฤติกรรมของ print ทั่วไป คุณสามารถเสริมบริบทของผลลัพธ์ของคุณ ทำให้ช่วงการดีบักของคุณมีประสิทธิภาพมากขึ้น
อย่าลังเลที่จะสำรวจเทคนิคนี้ในโปรเจกต์ของคุณเองและเพิ่มความสามารถในการดีบักใน Python ของคุณ!