Module & import
แยกโค้ดออกเป็นหลายไฟล์แล้วเรียกใช้กัน — ก้าวแรกของการเลิกเขียนทุกอย่างในไฟล์เดียว
เมื่อโปรแกรมโตขึ้น การยัดทุกอย่างไว้ไฟล์เดียวทำให้หาของยากและแก้ลำบาก module คือการแยกโค้ดเป็นหลายไฟล์ .py แล้ว import มาใช้ข้ามกัน — เป็นรากฐานของการจัดโปรเจกต์ที่ดี
module คือไฟล์ .py หนึ่งไฟล์
ทุกไฟล์ .py เป็น module อยู่แล้ว ตั้งชื่อไฟล์ให้สื่อความหมาย แล้ว import ฟังก์ชัน/ตัวแปรจากไฟล์อื่นมาใช้ได้
# ไฟล์ mathutils.py
def add(a, b):
return a + b
PI = 3.14159# ไฟล์ main.py (อยู่โฟลเดอร์เดียวกัน)
import mathutils
print(mathutils.add(2, 3)) # 5
print(mathutils.PI) # 3.14159รูปแบบการ import
import mathutils # ใช้ mathutils.add(...)
from mathutils import add # ใช้ add(...) ตรง ๆ
from mathutils import add, PI
import mathutils as mu # ตั้งชื่อย่อ ใช้ mu.add(...)
from mathutils import * # นำเข้าทุกอย่าง (ไม่แนะนำ — ชนกันได้)การ import * นำเข้าทุกชื่อจาก module ทำให้ไม่รู้ว่าชื่อไหนมาจากไหน และอาจทับชื่อที่มีอยู่จนเกิด bug ลึกลับ — ระบุชื่อที่ต้องใช้ให้ชัดเจนเสมอ
if __name__ == "__main__":
เมื่อไฟล์ถูก import โค้ดระดับบนสุดจะถูกรันด้วย ถ้าไม่อยากให้รันตอน import ให้ใส่ guard นี้ — มันรันเฉพาะตอนเรียกไฟล์นั้นตรง ๆ เท่านั้น
# mathutils.py
def add(a, b):
return a + b
if __name__ == "__main__":
# รันเฉพาะตอน 'python mathutils.py' ตรง ๆ
# ไม่รันตอนถูก import จากไฟล์อื่น
print("ทดสอบ:", add(2, 3))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 ดูว่าโค้ดทดสอบไม่รัน