On this page
Package & โครงสร้างโฟลเดอร์
จัดหลาย 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# import จาก package (ใช้จุดคั่นชั้น)
from myapp import models
from myapp.utils.text import clean
from myapp.utils import textlayout โปรเจกต์มาตรฐาน
โปรเจกต์จริงมักจัดแบบนี้ — แยกโค้ด (src), เทสต์ (tests), และไฟล์ตั้งค่าออกจากกันชัดเจน
my-project/
├── README.md # อธิบายโปรเจกต์ + วิธีรัน
├── requirements.txt # รายการ dependency
├── .gitignore # ไฟล์ที่ไม่เอาเข้า git
├── src/
│ └── myapp/
│ ├── __init__.py
│ ├── main.py
│ └── models.py
└── tests/
└── test_models.pylayout ที่ดีทำให้คนอื่น (และตัวเราในอีก 6 เดือน) เปิดมาแล้วรู้ทันทีว่าอะไรอยู่ตรงไหน — โค้ดอยู่ src, เทสต์อยู่ tests, README บอกวิธีเริ่ม นี่คือมาตรฐานที่ทุกโปรเจกต์ Python ทำคล้ายกัน
absolute vs relative import
# 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