Skip to content

บทที่ 7.1: PEP 8 และ Style Guide (มาตรฐานการจัดรูปแบบโค้ด)

เอกสารนี้อธิบายเกี่ยวกับ PEP 8 (Python Enhancement Proposal 8) ซึ่งเป็นแนวทางมาตรฐานอย่างเป็นทางการสำหรับการจัดรูปแบบโค้ดภาษา Python เพื่อเพิ่มความอ่านง่าย (Readability) ความเป็นระเบียบ และความเป็นเอกภาพเมื่อต้องทำงานร่วมกันในทีม


1. PEP 8 คืออะไร และทำไมจึงสำคัญ

PEP 8 คือคู่มือข้อแนะนำการจัดรูปแบบโค้ด (Style Guide) ของภาษา Python ที่เขียนขึ้นโดย Guido van Rossum และคณะ โดยยึดหลักปรัชญา "Readability counts" (ความอ่านง่ายเป็นเรื่องสำคัญ)

ข้อดีของการปฏิบัติตาม PEP 8:

  • โค้ดมีความสะอาด เป็นระเบียบ และอ่านเข้าใจง่าย
  • ลดเวลาในการทำ Code Review และบำรุงรักษาโค้ด (Maintainability)
  • สร้างมาตรฐานการเขียนที่เป็นอันหนึ่งอันเดียวกันทั้งโปรเจกต์

2. กฎการตั้งชื่อ (Naming Conventions)

ประเภท Element รูปแบบที่แนะนำ ตัวอย่าง
Variables / Functions snake_case (ตัวพิมพ์เล็กเชื่อมด้วย _) user_name, calculate_total()
Classes PascalCase / CamelCase (อักษรแรกตัวใหญ่) UserProfile, DatabaseConnection
Constants UPPER_CASE (ตัวพิมพ์ใหญ่ทั้งหมด) MAX_CONNECTIONS, API_KEY
Modules / Files snake_case (ตัวพิมพ์เล็กความยาวสั้น) file_utils.py, models.py
Private Attributes นำหน้าด้วย _ หนึ่งตัว _internal_status

3. การจัดรูปแบบโค้ด (Formatting Rules)

3.1 การย่อหน้าและการเว้นวรรค (Indentation & Whitespace)

ตัวตีความภาษา Python (Interpreter) บังคับใช้การย่อหน้าในการแบ่งบล็อกโค้ด โดยรองรับทั้งการใช้ Space และ Tab (\t)

  • ข้อกำหนดทางไวยากรณ์ (Syntax Rule): ต้องเลือกใช้อย่างใดอย่างหนึ่งอย่างสม่ำเสมอ ห้ามใช้ Space ผสมกับ Tab ในไฟล์หรือบล็อกเดียวกันเด็ดขาด เพราะจะทำให้เกิด TabError

  • รูปแบบ Tab (\t):** มีข้อดีทางเทคนิคคือ เป็นอักขระตัวเดียว (1 Byte/Unit) ไม่เกิดปัญหาเรื่องเศษ Space ขาดหรือเกินเมื่อแก้ไขโค้ด และช่วยให้ผู้พัฒนาแต่ละคนปรับตั้งค่าความกว้างในการแสดงผล (Display Width) บน Editor ของตนเองได้อิสระ

  • รูปแบบ Space 4 ตัว (ตามแนวทาง PEP 8):** เป็นข้อแนะนำกลางสำหรับโปรเจกต์ที่ต้องการให้ระยะการแสดงผลคงที่เท่ากันทุกเครื่องโดยไม่ขึ้นกับการตั้งค่า Editor เพื่อความเป็นเอกภาพในโปรเจกต์ขนาดใหญ่

  • เว้นบรรทัดว่าง 2 บรรทัด ระหว่าง Top-level Functions หรือ Classes

  • เว้นบรรทัดว่าง 1 บรรทัด ระหว่าง Methods ภายใน Class เดียวกัน
# ตัวอย่างการเว้นบรรทัดว่างและย่อหน้าตาม PEP 8
class UserAccount:
    def __init__(self, username: str):
        self.username = username

    def display_info(self):
        print(f"User: {self.username}")


def main():
    user = UserAccount("Sebastian")
    user.display_info()

3.2 ความยาวของบรรทัด (Line Length)

  • จำกัดความยาวของโค้ดไม่เกิน 79 ตัวอักษร ต่อบรรทัด (สำหรับ Docstring หรือ Comment ไม่เกิน 72 ตัวอักษร)
  • หากคำสั่งยาวเกินไป ให้ใช้การขึ้นบรรทัดใหม่ภายในวงเล็บ (), [], {}
# ไม่แนะนำ (บรรทัดยาวเกินไป)
def send_email(recipient_email, email_subject, email_body_content, attachment_files, is_html_format=True):
    pass

# แนะนำตาม PEP 8
def send_email(
    recipient_email: str,
    email_subject: str,
    email_body_content: str,
    attachment_files: list,
    is_html_format: bool = True
) -> bool:
    pass

3.3 ลำดับการ Import โมดูล (Imports Order)

ควรจัดกลุ่มการ import ไว้ที่ส่วนบนสุดของไฟล์เสมอ โดยแบ่งออกเป็น 3 กลุ่มหลัก และเว้น 1 บรรทัดว่างระหว่างกลุ่ม:

  1. Standard Library Imports (โมดูลติดมากับ Python)
  2. Third-Party Imports (โมดูลที่ติดตั้งผ่าน pip)
  3. Local Application Imports (โมดูลในโปรเจกต์ที่เราเขียนขึ้นเอง)
# 1. Standard Library
import os
import sys

# 2. Third-Party
import requests
from dotenv import load_dotenv

# 3. Local Application
from mymodule.database import connect_db

4. เครื่องมือช่วยตรวจสอบและจัดรูปแบบโค้ดอัตโนมัติ

นักพัฒนาไม่จำเป็นต้องจัดรูปแบบโค้ดด้วยตัวเองทั้งหมด สามารถใช้ Linters และ Auto-formatters เข้ามาช่วยตรวจและปรับโค้ดให้อัตโนมัติได้:

  • Flake8 / Ruff: เครื่องมือสำหรับสแกนตรวจสอบการละเมิดกฎ PEP 8 และหา Syntax Error
  • Black: เครื่องมือจัดฟอร์แมตโค้ดอัตโนมัติ (Uncompromising Code Formatter)
  • isort: เครื่องมือจัดเรียงลำดับคำสั่ง import ให้เป็นระเบียบอัตโนมัติ
# การติดตั้งเครื่องมือ
pip install black flake8 isort

# สั่งตรวจเช็กไฟล์
flake8 main.py

# สั่งจัดรูปแบบไฟล์อัตโนมัติ
black main.py
isort main.py