การใช้งาน Python 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
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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

  1. docstring แบบบรรทัดเดียว
    ใช้สำหรับฟังก์ชันหรือเมธอดที่ง่าย ๆ โดยเขียนอธิบายสั้น ๆ เพียงบรรทัดเดียว
  2. docstring หลายบรรทัด
    หากต้องการอธิบายเพิ่มเติม ให้เขียนบรรทัดแรกเป็นสรุป จากนั้นเว้นบรรทัดแล้วเขียนรายละเอียดเพิ่มเติม
  3. การจัดย่อหน้าและการเว้นบรรทัด
    ใช้การเว้นบรรทัดและการย่อหน้าเพื่อให้อ่านง่าย และแยกข้อมูลของพารามิเตอร์และค่าที่คืนกลับให้ชัดเจน

แนวทางปฏิบัติที่ดีที่สุด

  • อธิบายอย่างกระชับและชัดเจน
    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

  1. ความสอดคล้องของโค้ด
    มั่นใจได้ว่าโค้ดตัวอย่างใน docstring ทำงานได้จริง
  2. การทดสอบอัตโนมัติ
    ลดภาระการทดสอบด้วยตนเอง เพียงรัน 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 ได้โดยอัตโนมัติ ขั้นตอนคือ:

  1. ติดตั้ง Sphinx: pip install sphinx
  2. เริ่มโปรเจกต์ด้วย sphinx-quickstart
  3. ตั้งค่า 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 ได้อัตโนมัติ ลดภาระการเขียนเอกสารเองและมั่นใจว่าเอกสารอัปเดตตรงกับโค้ดเสมอ

年収訴求