- 1 1. docstring ของ Python คืออะไร?
- 2 2. วิธีเขียน docstring พื้นฐาน
- 3 3. รูปแบบของ docstring (Google Style, NumPy Style, reStructuredText Style)
- 4 4. PEP 257 และแนวทางปฏิบัติที่ดีที่สุด
- 5 5. การทดสอบด้วย docstring (doctest)
- 6 6. ตัวอย่างการใช้งานจริง: การสร้างเอกสารด้วย docstring
- 7 7. ข้อผิดพลาดที่พบบ่อยและวิธีหลีกเลี่ยง
- 8 8. สรุป: การสร้างเอกสารด้วย docstring อย่างมีประสิทธิภาพ
1. docstring
ของ Python คืออะไร?
docstring
ใน Python คือสตริงพิเศษที่ใช้เพิ่มคำอธิบายให้กับโค้ด เช่น ฟังก์ชัน คลาส หรือโมดูล docstring
มีบทบาทสำคัญในการเพิ่มความสามารถในการบำรุงรักษาโค้ด และช่วยให้นักพัฒนาคนอื่นเข้าใจโค้ดได้ง่ายขึ้น นอกจากนี้ยังสามารถใช้เครื่องมือสร้างเอกสารอัตโนมัติ (เช่น Sphinx) เพื่อสร้างเอกสารจาก docstring
ได้อีกด้วย
ตำแหน่งและรูปแบบของ docstring
docstring
จะถูกวางไว้ทันทีหลังการประกาศฟังก์ชัน คลาส หรือโมดูล โดยมีรูปแบบพื้นฐานคือการใช้เครื่องหมาย triple double quotes ครอบไว้ ตัวอย่างเช่น:
def ชื่อฟังก์ชัน(พารามิเตอร์):
"""
เขียนคำอธิบายสั้น ๆ ของฟังก์ชันที่นี่
พารามิเตอร์:
ชื่อพารามิเตอร์ (ชนิดข้อมูล): คำอธิบายรายละเอียดของพารามิเตอร์
คืนค่า:
ชนิดข้อมูล: คำอธิบายค่าที่คืนกลับ
"""
pass
docstring
ยังสามารถใช้งานได้กับฟังก์ชันในตัวของ Python เช่น help()
และยังแสดงเป็นข้อความช่วยเหลือใน editor ซึ่งทำให้มีบทบาทสำคัญในฐานะเอกสารของโค้ด
2. วิธีเขียน docstring พื้นฐาน
docstring
ของ Python ใช้เพื่ออธิบายการทำงานและสเปกของฟังก์ชันหรือคลาสอย่างชัดเจนและกระชับ โดยทั่วไปจะเริ่มด้วยการอธิบายวัตถุประสงค์ของฟังก์ชัน จากนั้นจึงอธิบายพารามิเตอร์ ค่าที่คืนกลับ และข้อผิดพลาดที่อาจเกิดขึ้น การทำตาม PEP 257 (Python Docstring Conventions) จะช่วยรักษาความสม่ำเสมอและทำให้โค้ดเข้าใจง่ายขึ้น
โครงสร้างพื้นฐานของ docstring
docstring
แบบบรรทัดเดียวใช้เมื่ออธิบายฟังก์ชันสั้น ๆ เช่น:
def add(a, b):
"""บวกตัวเลขสองจำนวนและคืนค่า"""
return a + b
docstring
แบบหลายบรรทัดใช้เมื่อจำเป็นต้องอธิบายรายละเอียดมากขึ้น เช่น การทำงาน พารามิเตอร์ และค่าที่คืนกลับ:
def add(a, b):
"""
บวกตัวเลขสองจำนวนและคืนค่าผลลัพธ์
พารามิเตอร์:
a (int): เลขจำนวนแรก
b (int): เลขจำนวนที่สอง
คืนค่า:
int: ผลรวมของเลขทั้งสอง
"""
return a + b
3. รูปแบบของ docstring (Google Style, NumPy Style, reStructuredText Style)
รูปแบบของ docstring
มีหลายประเภท ขึ้นอยู่กับโครงการหรือเครื่องมือที่ใช้งาน โดยทั่วไปมีอยู่ 3 รูปแบบที่นิยม ได้แก่ Google Style, NumPy Style และ reStructuredText Style
Google Style
Google Style มีลักษณะเด่นคือกระชับและอ่านง่าย โดยพารามิเตอร์และค่าที่คืนกลับจะถูกเขียนภายใต้หัวข้อ Args
และ Returns
เช่น:
def add(a, b):
"""
บวกตัวเลขสองจำนวนและคืนค่า
Args:
a (int): จำนวนแรกที่ต้องการบวก
b (int): จำนวนที่สองที่ต้องการบวก
Returns:
int: ผลรวมของตัวเลขทั้งสอง
"""
return a + b
NumPy Style
NumPy Style เป็นฟอร์แมตที่ใช้บ่อยในงานคำนวณทางวิทยาศาสตร์และการวิเคราะห์ข้อมูล โดยใช้หัวข้อ Parameters
และ Returns
เพื่ออธิบายรายละเอียด:
def add(a, b):
"""
บวกตัวเลขสองจำนวนและคืนค่า
Parameters
----------
a : int
จำนวนแรกที่ต้องการบวก
b : int
จำนวนที่สองที่ต้องการบวก
Returns
-------
int
ผลรวมของตัวเลขทั้งสอง
"""
return a + b
reStructuredText Style
รูปแบบ reStructuredText ใช้กับ Sphinx ซึ่งสามารถสร้างเอกสาร HTML หรือ PDF จากโค้ดได้โดยตรง นิยมใช้ในโปรเจกต์ที่ซับซ้อน:
def add(a, b):
"""
บวกตัวเลขสองจำนวน
:param a: จำนวนแรกที่ต้องการบวก
:type a: int
:param b: จำนวนที่สองที่ต้องการบวก
:type b: int
:return: ผลรวมของตัวเลขทั้งสอง
:rtype: int
"""
return a + b
4. PEP 257 และแนวทางปฏิบัติที่ดีที่สุด
PEP 257 เป็นแนวทางอย่างเป็นทางการเกี่ยวกับ docstring
โดยการปฏิบัติตามแนวทางนี้จะช่วยให้โค้ดอ่านง่ายและเป็นมาตรฐานมากขึ้น
ประเด็นสำคัญใน PEP 257
- docstring แบบบรรทัดเดียว
ใช้สำหรับฟังก์ชันหรือเมธอดที่ง่าย ๆ โดยเขียนอธิบายสั้น ๆ เพียงบรรทัดเดียว - docstring หลายบรรทัด
หากต้องการอธิบายเพิ่มเติม ให้เขียนบรรทัดแรกเป็นสรุป จากนั้นเว้นบรรทัดแล้วเขียนรายละเอียดเพิ่มเติม - การจัดย่อหน้าและการเว้นบรรทัด
ใช้การเว้นบรรทัดและการย่อหน้าเพื่อให้อ่านง่าย และแยกข้อมูลของพารามิเตอร์และค่าที่คืนกลับให้ชัดเจน
แนวทางปฏิบัติที่ดีที่สุด
- อธิบายอย่างกระชับและชัดเจน
docstring
ควรอธิบายฟังก์ชันหรือคลาสให้เข้าใจได้โดยไม่ใส่ข้อมูลที่ไม่จำเป็น - รักษาความสม่ำเสมอ
เลือกใช้สไตล์เดียวกันทั้งโปรเจกต์ เช่น Google Style หรือ NumPy Style เพื่อเพิ่มความเป็นระบบ
5. การทดสอบด้วย docstring (doctest)
Python มีโมดูล doctest
ที่สามารถทดสอบตัวอย่างโค้ดที่เขียนไว้ใน docstring
ได้จริง ฟีเจอร์นี้ช่วยตรวจสอบว่าโค้ดตัวอย่างในเอกสารทำงานถูกต้องหรือไม่ ทำให้มั่นใจได้ว่าโค้ดและเอกสารมีความสอดคล้องกัน
วิธีใช้ doctest เบื้องต้น
doctest
จะตรวจสอบโค้ดที่อยู่ใน docstring
โดยอัตโนมัติ ตัวอย่างเช่น:
def add(a, b):
"""
บวกตัวเลขสองจำนวนและคืนค่า
Args:
a (int): จำนวนแรก
b (int): จำนวนที่สอง
Returns:
int: ผลรวมของตัวเลขทั้งสอง
Example:
>>> add(2, 3)
5
>>> add(0, 0)
0
"""
return a + b
if __name__ == "__main__":
import doctest
doctest.testmod()
หากผลลัพธ์ถูกต้องจะไม่มีข้อความแสดง แต่ถ้ามีข้อผิดพลาดจะมีข้อความ error ปรากฏขึ้น
ข้อดีของการใช้ doctest
- ความสอดคล้องของโค้ด
มั่นใจได้ว่าโค้ดตัวอย่างในdocstring
ทำงานได้จริง - การทดสอบอัตโนมัติ
ลดภาระการทดสอบด้วยตนเอง เพียงรันdoctest
ก็สามารถตรวจสอบโค้ดทั้งหมดที่อยู่ในเอกสารได้
6. ตัวอย่างการใช้งานจริง: การสร้างเอกสารด้วย docstring
การใช้ docstring
ช่วยเพิ่มความเข้าใจในโค้ดและทำให้โค้ดอ่านง่ายขึ้น ตัวอย่างเช่น การเพิ่ม docstring ให้กับคลาสและเมธอด:
class Calculator:
"""
คลาสเครื่องคิดเลขอย่างง่าย
คลาสนี้รองรับการบวก ลบ คูณ และหาร
Attributes:
result (int): ค่าผลลัพธ์ล่าสุด
"""
def __init__(self):
"""
คอนสตรัคเตอร์ของคลาส Calculator
เริ่มต้น result = 0
"""
self.result = 0
def add(self, a, b):
"""
บวกตัวเลขสองจำนวนและคืนค่าผลลัพธ์
Args:
a (int): จำนวนแรก
b (int): จำนวนที่สอง
Returns:
int: ผลรวมของตัวเลขทั้งสอง
"""
self.result = a + b
return self.result
การสร้างเอกสารด้วย Sphinx
Sphinx สามารถสร้างเอกสาร HTML หรือ PDF จาก docstring
ได้โดยอัตโนมัติ ขั้นตอนคือ:
- ติดตั้ง Sphinx:
pip install sphinx
- เริ่มโปรเจกต์ด้วย
sphinx-quickstart
- ตั้งค่า
conf.py
และรันmake html
เพื่อสร้างเอกสาร
7. ข้อผิดพลาดที่พบบ่อยและวิธีหลีกเลี่ยง
การเขียน docstring
มักมีข้อผิดพลาดที่ผู้เริ่มต้นทำบ่อย ส่วนนี้จะแนะนำข้อผิดพลาดที่พบบ่อยและแนวทางแก้ไข
1. คำอธิบายที่คลุมเครือ
docstring
ควรชัดเจนและกระชับ ตัวอย่างที่ไม่ดี:
def add(a, b):
"""บวกตัวเลขสองจำนวน"""
return a + b
โค้ดนี้ไม่บอกชนิดข้อมูลและค่าที่คืนกลับ วิธีที่ถูกต้อง:
def add(a, b):
"""
บวกจำนวนเต็มสองจำนวนและคืนผลลัพธ์
Args:
a (int): จำนวนแรก
b (int): จำนวนที่สอง
Returns:
int: ผลรวมของจำนวนทั้งสอง
"""
return a + b
2. การอธิบายพารามิเตอร์และค่าที่คืนกลับไม่ครบถ้วน
หาก docstring
ไม่อธิบายรายละเอียดของพารามิเตอร์หรือค่าที่คืนกลับ ผู้ใช้ฟังก์ชันอาจเข้าใจผิด ตัวอย่างที่ไม่ดี:
def divide(a, b):
"""หารตัวเลขสองจำนวน"""
return a / b
ในตัวอย่างนี้ไม่มีการอธิบายว่าเกิดอะไรขึ้นเมื่อหารด้วยศูนย์ วิธีที่ถูกต้อง:
def divide(a, b):
"""
หารตัวเลขสองจำนวนและคืนค่าผลลัพธ์ หาก b = 0 จะเกิด ZeroDivisionError
Args:
a (float): ตัวตั้ง
b (float): ตัวหาร
Returns:
float: ผลลัพธ์การหาร
Raises:
ZeroDivisionError: หาก b = 0
"""
if b == 0:
raise ZeroDivisionError("ไม่สามารถหารด้วยศูนย์ได้")
return a / b
8. สรุป: การสร้างเอกสารด้วย docstring อย่างมีประสิทธิภาพ
ในบทความนี้เราได้อธิบายถึงความสำคัญของ docstring
วิธีการเขียน รูปแบบต่าง ๆ และแนวทางที่ดีที่สุด การใช้ PEP 257 เป็นแนวทางช่วยให้ได้เอกสารที่อ่านง่ายและมีมาตรฐาน
การสร้างเอกสารที่สอดคล้องกับ PEP 257
PEP 257 แนะนำการเขียน docstring
ทั้งแบบสั้นและยาวเพื่ออธิบายโค้ดได้อย่างชัดเจนและสม่ำเสมอ
การทดสอบโค้ดตัวอย่างด้วย doctest
doctest
ช่วยตรวจสอบโค้ดตัวอย่างในเอกสาร ทำให้มั่นใจว่าโค้ดและเอกสารตรงกันและลดข้อผิดพลาด
การสร้างเอกสารอัตโนมัติด้วย Sphinx
ด้วย Sphinx เราสามารถสร้างเอกสาร HTML หรือ PDF จาก docstring
ได้อัตโนมัติ ลดภาระการเขียนเอกสารเองและมั่นใจว่าเอกสารอัปเดตตรงกับโค้ดเสมอ