Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การบันทึก Python:A Guide

คุณเพิ่งสร้างแอปพลิเคชันและสังเกตเห็นว่ามีบางอย่างไม่ทำงานตามที่ตั้งใจไว้ คุณลักษณะที่คุณเพิ่งนำมาใช้มีการทำงานในลักษณะที่คุณไม่คาดคิด คุณควรทำอะไร? คุณจะจัดการกับปัญหานี้อย่างไร?

ในการพัฒนาซอฟต์แวร์ โปรแกรมเมอร์อาศัยการบันทึกเพื่อติดตามเหตุการณ์ในขณะที่ซอฟต์แวร์กำลังทำงาน ซึ่งช่วยให้พวกเขาติดตามสาเหตุของปัญหาได้อย่างมีประสิทธิภาพหากเกิดขึ้น

ในคู่มือนี้ เราจะพูดถึงสาเหตุที่คุณควรเก็บบันทึกแอปพลิเคชันและวิธีที่คุณสามารถใช้โมดูลการบันทึก Python เพื่อติดตามกิจกรรมในโปรแกรมของคุณ

ทำไมคุณควรเก็บบันทึก

การเก็บบันทึกช่วยให้คุณเขียนโค้ดที่บำรุงรักษาได้มากขึ้น เมื่อคุณใช้โมดูล เช่น การบันทึก คุณสามารถเก็บบันทึกเหตุการณ์ทั้งหมดที่เกิดขึ้นในโปรแกรมของคุณได้อย่างแม่นยำ ซึ่งหมายความว่าคุณสามารถดูได้ว่าโค้ดใดที่รันอยู่และโค้ดใดที่รันไม่สำเร็จ

ใน Python นักพัฒนามักจะพึ่งพา print() คำสั่งเพื่อบันทึกรหัสของพวกเขา เป็นแนวทางปฏิบัติที่ทุกคน – ตั้งแต่เริ่มต้นจนถึงผู้เชี่ยวชาญ – มีความผิดในการใช้งานและมีเหตุผลที่ดี print() คำสั่งใช้งานง่าย มันง่าย

อย่างไรก็ตาม print() คำสั่งไม่ใช่วิธีที่ดีที่สุดในการเก็บบันทึกของรหัสของคุณ ประการหนึ่ง print() คำสั่งสามารถใช้พิมพ์เอาต์พุตใดๆ ไปยังคอนโซลได้ ซึ่งหมายความว่าอาจสร้างความสับสนในการแยกแยะว่าเอาต์พุตใดที่จะจัดเก็บเป็นบันทึกและเอาต์พุตใดที่เป็นส่วนหนึ่งของโปรแกรมหลักของคุณ ยิ่งไปกว่านั้น print() คำสั่งจะไม่บันทึกบันทึกของคุณโดยค่าเริ่มต้น

นั่นคือสิ่งที่โมดูลการบันทึก Python มีประโยชน์ เมื่อใช้โมดูลระบบการบันทึก คุณจะสามารถเก็บบันทึกที่แม่นยำยิ่งขึ้นว่าเหตุการณ์ใดบ้างที่เรียกใช้ในโค้ดของคุณ วิธีนี้จะช่วยให้คุณดีบักโค้ดได้อย่างมีประสิทธิภาพและแก้ไขข้อผิดพลาด

วิธีใช้โมดูลการบันทึก Python

ในบทช่วยสอนนี้ เราจะเพิ่มข้อความการบันทึกพื้นฐานลงในโปรแกรมที่จะตรวจสอบรายการเกรดของนักเรียนและคำนวณว่าพวกเขาสอบตกหรือสอบผ่านหรือไม่ พิจารณารหัสต่อไปนี้:

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []

for i in range(0, len(students)):
	print("Calculating grade for {}".format(students[i]))
	if grades[i] > 55:
		pass_fail.append(True)
		print("{} has passed their exam.".format(students[i)))
	else:
		pass_fail.append(False)
		print("{} has failed their exam.".format(students[i)))

print("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")

รหัสด้านบนคำนวณว่านักเรียนห้าคนในชั้นประถมศึกษาปีที่ 4 แต่ละคนผ่านการทดสอบหรือไม่ ในโปรแกรมของเรา เราประกาศสามรายการ หนึ่งรายการเก็บชื่อนักเรียนแต่ละคน รายชื่ออื่นเก็บเกรดที่นักเรียนแต่ละคนได้รับ รายการสุดท้ายจะเก็บข้อมูลว่านักเรียนสอบผ่านหรือไม่ผ่าน

เมื่อเราเรียกใช้โปรแกรม ค่าต่อไปนี้จะถูกส่งคืน:

Calculating grade for Martin.
Martin has passed their exam.
Calculating grade for Lewis.
Lewis has passed their exam.
Calculating grades for Terri.
Terri has passed their exam.
Calculating grades for Bart.
Bart has failed their exam.

print() คำสั่งแสดงว่าโค้ดของเราใช้งานได้ แต่เราสามารถใช้ logging() โมดูลเพื่อแสดงข้อมูลนี้แทน ซึ่งจะทำให้เราสามารถแยกแยะข้อความการดีบักของเราออกจากผลลัพธ์ของโปรแกรมของเราได้

ในการเริ่มต้น ให้เพิ่มไลบรารีมาตรฐานการบันทึกที่ด้านบนสุดของโปรแกรมของเรา:

import logging

ตอนนี้เราได้นำเข้าไลบรารีการบันทึกแล้ว เราสามารถเริ่มติดตามบันทึกในโค้ดของเราได้ สำหรับตัวอย่างนี้ เราจะติดตามบันทึกโดยใช้การกำหนดค่า DEBUG เนื่องจากเราไม่สนใจติดตามคำเตือนในขณะนี้ สำหรับการอ้างอิง นี่คือตัวเลือกการบันทึกที่คุณสามารถระบุได้:

  • วิกฤติ:ใช้เพื่อแสดงข้อผิดพลาดร้ายแรง (logging.critical())
  • ข้อผิดพลาด:ใช้เพื่อแสดงปัญหา (logging.error())
  • คำเตือน:ใช้เพื่อแสดงพฤติกรรมที่ไม่คาดคิด (logging.warning())
  • INFO:ใช้เพื่อแสดงโปรแกรมกำลังทำงาน (logging.info())
  • DEBUG:ใช้เพื่อดีบักโค้ด (logging.debug())

การกำหนดค่าเริ่มต้นสำหรับไลบรารีการบันทึกคือคำเตือน ดังนั้นเราจะต้องรีเซ็ตโดยใช้รหัสนี้:

import logging

logging.basicConfig(level=logging.DEBUG)

ตอนนี้เราพร้อมที่จะเริ่มแก้จุดบกพร่องโค้ดของเราแล้ว มาแทนที่ print() . ของเรา ข้อความที่บอกเราว่ากำลังคำนวณเกรดหรือโปรแกรมของเราเสร็จสิ้นด้วยข้อความแก้ไขข้อบกพร่อง:

import logging

logging.basicConfig(level=logging.DEBUG)

students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []

for i in range(0, len(students)):
	logging.debug("Calculating grade for {}".format(students[i]))
	if grades[i] > 55:
		pass_fail.append(True)
		print("{} has passed their exam.".format(students[i]))
	else:
		pass_fail.append(False)
		print("{} has failed their exam.".format(students[i]))

logging.debug("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")

เมื่อเรารันโค้ดของเรา ค่าต่อไปนี้จะถูกส่งคืน:

DEBUG:root:Calculating grade for Martin
Martin has passed their exam.
DEBUG:root:Calculating grade for Lewis
Lewis has passed their exam.
DEBUG:root:Calculating grade for Terri
Terri has passed their exam.
DEBUG:root:Calculating grade for Bart
Bart has failed their exam.
DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

คุณจะเห็นได้ว่าผลงานของเรามีเนื้อหาเหมือนกับก่อนหน้านี้ อย่างไรก็ตาม ข้อความ “กำลังคำนวณเกรดสำหรับ…” และข้อความที่แจ้งว่าคำนวณเกรดแล้วดูแตกต่างออกไป ข้อความ “DEBUG:root:” ปรากฏขึ้นก่อนคำสั่งเหล่านั้น

ซึ่งช่วยให้เราติดตามว่าโปรแกรมของเราทำอะไรอยู่ได้ตลอดเวลา เนื่องจากโมดูลการบันทึกเหตุการณ์จะเพิ่มข้อความดังกล่าวลงในโปรแกรมของเรา จึงเป็นเรื่องง่ายที่จะเข้าใจว่าโปรแกรมของเราส่งออกข้อความใด และข้อความใดใช้สำหรับการดีบัก

ในกรณีนี้ ข้อความ “[นักเรียน]” สอบไม่ผ่าน” เป็นข้อมูลสำคัญที่บอกเราว่านักเรียนแต่ละคนสอบผ่านหรือสอบไม่ผ่าน อย่างอื่นมีประโยชน์ในการดูว่าโปรแกรมของเราทำงานอย่างไร แต่ไม่มีประโยชน์สำหรับผู้ใช้ ดังนั้นเราจึงติดตามข้อความเหล่านี้โดยใช้การบันทึกการโทร

วิธีการเก็บบันทึกในไฟล์

โมดูลการบันทึกช่วยให้คุณติดตามบันทึกของคุณในไฟล์ สิ่งนี้มีประโยชน์เพราะหมายความว่าคุณจะไม่สูญเสียบันทึกของคุณเมื่อคุณปิดเชลล์ Python คุณจะมีบันทึกถาวรว่าโปรแกรมของคุณทำงานอย่างไรในโอกาสพิเศษต่างๆ

สิ่งที่คุณต้องทำคือใส่อาร์กิวเมนต์ชื่อไฟล์ในบรรทัดการกำหนดค่าตัวจัดการการบันทึก จากนั้นโปรแกรมของคุณจะบันทึกบันทึกลงในไฟล์โดยอัตโนมัติ:

import logging

logging.basicConfig(level=logging.DEBUG, filename="student_data.log")

…

เมื่อเรารันโค้ด บันทึกของเราจะถูกเพิ่มในชื่อไฟล์ที่เราระบุ หากเราเปิดไฟล์ “student_data.log” ข้อมูลต่อไปนี้จะถูกส่งกลับ:

DEBUG:root:Calculating grade for Martin
DEBUG:root:Calculating grade for Lewis
DEBUG:root:Calculating grade for Terri
DEBUG:root:Calculating grade for Bart
DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

โปรดสังเกตว่าเอาต์พุตการดีบักของเรามีเฉพาะข้อความที่เราระบุเป็นบันทึกโดยใช้ logging.debug() กระบวนการ. สิ่งนี้มีประโยชน์เพราะช่วยให้เราแยกแยะผลลัพธ์ของโปรแกรม - ซึ่งแสดงโดยใช้ print() คำสั่ง – จากบันทึกการดีบัก

คุณยังสามารถเพิ่มพารามิเตอร์เพื่อติดตามเมื่อมีการเพิ่มรายการลงในบันทึกของคุณ เราสามารถทำได้โดยใช้รหัสต่อไปนี้:

logging.basicConfig(
level=logging.DEBUG,
filename="student_data.log",
format="%(asctime)s:%(levelname)s:%(message)s"
)

รหัสนี้เพิ่มข้อมูลต่อไปนี้ในไฟล์ student_data.log ของเรา:

2020-06-18 08:27:50,123:DEBUG:Calculating grade for Martin
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Lewis
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Terri
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Bart
2020-06-18 08:27:50,124:DEBUG:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

ตอนนี้เรารู้แล้วว่าแต่ละบรรทัดของโค้ดของเราถูกเรียกใช้งานเมื่อใด ในโปรแกรมที่ยาวกว่านี้ ข้อมูลนี้จะเป็นประโยชน์อย่างยิ่งเพราะจะช่วยให้เราเข้าใจลำดับการทำงานของโค้ดและความเร็วของโค้ด

บทสรุป

โมดูลการบันทึก Python เป็นเครื่องมือที่มีประโยชน์อย่างเหลือเชื่อสำหรับการดีบัก ช่วยให้คุณติดตามกิจกรรมทั้งหมดที่รันในโปรแกรมของคุณและให้ตัวเลือกในการบันทึกเหตุการณ์เหล่านั้นเป็นไฟล์แยกต่างหาก วิธีนี้จะช่วยให้คุณแก้ไขจุดบกพร่องของโค้ดได้อย่างมีประสิทธิภาพมากขึ้น และทำความเข้าใจว่าเหตุการณ์ใดบ้างที่ดำเนินการเมื่อคุณเรียกใช้โปรแกรม