บทที่ 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 บรรทัดว่างระหว่างกลุ่ม:
- Standard Library Imports (โมดูลติดมากับ Python)
- Third-Party Imports (โมดูลที่ติดตั้งผ่าน
pip) - 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ให้เป็นระเบียบอัตโนมัติ