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

Module & import

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

แยกโค้ดออกเป็นหลายไฟล์แล้วเรียกใช้กัน — ก้าวแรกของการเลิกเขียนทุกอย่างในไฟล์เดียว

เมื่อโปรแกรมโตขึ้น การยัดทุกอย่างไว้ไฟล์เดียวทำให้หาของยากและแก้ลำบาก module คือการแยกโค้ดเป็นหลายไฟล์ .py แล้ว import มาใช้ข้ามกัน — เป็นรากฐานของการจัดโปรเจกต์ที่ดี

module คือไฟล์ .py หนึ่งไฟล์

ทุกไฟล์ .py เป็น module อยู่แล้ว ตั้งชื่อไฟล์ให้สื่อความหมาย แล้ว import ฟังก์ชัน/ตัวแปรจากไฟล์อื่นมาใช้ได้

python
# ไฟล์ mathutils.py
def add(a, b):
    return a + b

PI = 3.14159
python
# ไฟล์ main.py (อยู่โฟลเดอร์เดียวกัน)
import mathutils

print(mathutils.add(2, 3))   # 5
print(mathutils.PI)          # 3.14159

รูปแบบการ import

python
import mathutils              # ใช้ mathutils.add(...)
from mathutils import add    # ใช้ add(...) ตรง ๆ
from mathutils import add, PI
import mathutils as mu       # ตั้งชื่อย่อ ใช้ mu.add(...)
from mathutils import *      # นำเข้าทุกอย่าง (ไม่แนะนำ — ชนกันได้)
เลี่ยง from module import *

การ import * นำเข้าทุกชื่อจาก module ทำให้ไม่รู้ว่าชื่อไหนมาจากไหน และอาจทับชื่อที่มีอยู่จนเกิด bug ลึกลับ — ระบุชื่อที่ต้องใช้ให้ชัดเจนเสมอ

if __name__ == "__main__":

เมื่อไฟล์ถูก import โค้ดระดับบนสุดจะถูกรันด้วย ถ้าไม่อยากให้รันตอน import ให้ใส่ guard นี้ — มันรันเฉพาะตอนเรียกไฟล์นั้นตรง ๆ เท่านั้น

python
# mathutils.py
def add(a, b):
    return a + b

if __name__ == "__main__":
    # รันเฉพาะตอน 'python mathutils.py' ตรง ๆ
    # ไม่รันตอนถูก import จากไฟล์อื่น
    print("ทดสอบ:", add(2, 3))
__name__ คืออะไร

Python ตั้งตัวแปร __name__ ให้แต่ละ module ถ้าไฟล์ถูกรันตรง ๆ ค่าจะเป็น "__main__" แต่ถ้าถูก import ค่าจะเป็นชื่อ module — guard นี้จึงแยก "รันเอง" ออกจาก "ถูกเรียกใช้" ได้

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

  • ทุกไฟล์ .py เป็น module — import มาใช้ข้ามไฟล์ได้
  • import มีหลายแบบ: import x / from x import y / as ชื่อย่อ
  • เลี่ยง import * เพราะทำให้ชื่อชนและไม่รู้ที่มา
  • if __name__ == "__main__": รันเฉพาะตอนเรียกไฟล์ตรง ๆ ไม่รันตอน import
แบบฝึกหัด

1) แยกฟังก์ชันคำนวณไปไว้ไฟล์ calc.py แล้ว import มาใช้ใน main.py 2) ลอง import 3 แบบ (import, from import, as) กับ module เดียวกัน 3) ใส่ if __name__=="__main__" ในไฟล์ที่มีโค้ดทดสอบ แล้ว import ดูว่าโค้ดทดสอบไม่รัน