Notes & software courses · Free to learn
Aph's Blog
On this page

Package & โครงสร้างโฟลเดอร์

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

จัดหลาย module เป็นโฟลเดอร์ และวาง layout โปรเจกต์แบบที่ใช้กันจริง

เมื่อ module เยอะขึ้น เราจัดมันเป็น package (โฟลเดอร์) เพื่อให้เป็นระเบียบ หัวข้อนี้สอนวิธีสร้าง package และวาง layout โปรเจกต์มาตรฐานที่คนอื่นเปิดมาแล้วเข้าใจทันที

package = โฟลเดอร์ของ module

package คือโฟลเดอร์ที่รวม module หลายไฟล์ เดิมต้องมีไฟล์ __init__.py (อาจว่างเปล่า) เพื่อบอกว่าโฟลเดอร์นี้เป็น package — Python สมัยใหม่ไม่บังคับแล้วแต่ยังนิยมใส่

myapp/
├── __init__.py        # บอกว่า myapp เป็น package
├── models.py
└── utils/
    ├── __init__.py
    └── text.py
python
# import จาก package (ใช้จุดคั่นชั้น)
from myapp import models
from myapp.utils.text import clean
from myapp.utils import text

layout โปรเจกต์มาตรฐาน

โปรเจกต์จริงมักจัดแบบนี้ — แยกโค้ด (src), เทสต์ (tests), และไฟล์ตั้งค่าออกจากกันชัดเจน

my-project/
├── README.md          # อธิบายโปรเจกต์ + วิธีรัน
├── requirements.txt   # รายการ dependency
├── .gitignore         # ไฟล์ที่ไม่เอาเข้า git
├── src/
│   └── myapp/
│       ├── __init__.py
│       ├── main.py
│       └── models.py
└── tests/
    └── test_models.py
ทำไมต้องแยกให้เป็นระเบียบ

layout ที่ดีทำให้คนอื่น (และตัวเราในอีก 6 เดือน) เปิดมาแล้วรู้ทันทีว่าอะไรอยู่ตรงไหน — โค้ดอยู่ src, เทสต์อยู่ tests, README บอกวิธีเริ่ม นี่คือมาตรฐานที่ทุกโปรเจกต์ Python ทำคล้ายกัน

absolute vs relative import

python
# absolute import (แนะนำ — ชัดเจน อ่านง่าย)
from myapp.utils.text import clean

# relative import (อ้างตำแหน่งเทียบไฟล์ปัจจุบัน)
from .utils.text import clean      # . = แพ็กเกจปัจจุบัน
from ..models import User          # .. = แพ็กเกจแม่

สรุปหัวข้อนี้

  • package = โฟลเดอร์รวม module (นิยมมี __init__.py)
  • import ข้ามชั้นด้วยจุด: from myapp.utils.text import clean
  • layout มาตรฐาน: src/ (โค้ด), tests/ (เทสต์), README, requirements.txt, .gitignore
  • นิยม absolute import เพราะชัดเจนกว่า relative
แบบฝึกหัด

1) สร้าง package ชื่อ myapp ที่มี models.py และ utils/text.py 2) import ฟังก์ชันจาก myapp.utils.text มาใช้ 3) จัดโปรเจกต์เล็ก ๆ ตาม layout มาตรฐาน (src/tests/README) 4) อธิบายข้อดีของการแยก tests ออกจาก src