อาจจะเป็นเรื่องที่ดูง่ายสำหรับคนส่วนใหญ่นะครับ แต่เท่าที่อ่านมาหลาย ๆ กระทู้พบว่าบางคนยังใช้คำผิดๆ
สับไปสับมาระหว่าง module และ package ซึ่งจะขอกล่าวในส่วนที่เีกี่ยวข้องกับ Python เท่านั้นนะครับ
Module
คำว่า module ในทาง logical เป็นคำเรียกของโปรแกรมย่อยที่มีขนาดเล็กหรือในทาง physical ก็คือ file
หนึ่งไฟล์ที่เราใช้ในการเขียนโปรแกรมขึ้นมาสักหนึ่งโปรแกรมเป็นนามสกุล .py นั่นเอง ซึ่งใน python
จะมี form มาตรฐานของการเขียน module หลาย ๆ ท่านอาจจะเห็นจากตัว file python บางไฟล์
เช่น if __name__ == '__main__' ก็เป็นมาตรฐานของการเขียน python ทั่งนี้มาตรฐานจะเขียนตาม
หรือไม่ก็ได้(เขียนตาม form จะทำให้ผู้ทีมาพัฒนาต่อเข้าใจได้ดีกว่า)
Package
Package ในทาง logical คือ package นั้นคือชุดของ module หลายตัวที่มีความเกี่ยวข้องกัน หรือในทาง
Physical คือ ตัว directory ที่เก็บรวบรวมตัวไฟล์หรือ module ที่เกี่ยวข้องกันไว้ หรือพูดง่าย ๆ ก็คือ Folder
ที่เก็บรวบรวมตัว file .py ที่เกี่ยวข้องกันไว้ด้วยกัน ซึ่งถ้าหากเรา new package ขึ้นมาใหม่ ๆ หนึ่งตัว(ใน eclipse)
เราจะเห็นว่ามันจะ add ตัว ไฟล์ ๆ หนึ่งเข้าไปไว้ใน Folder package ตัวนั้นชื่อว่า __init__.py(หัวหน้า module)
จะเห็นว่าชื่อไฟล์นี้เหมือนกันการกำหนด constructor (เสมือน) ของclass หรือ def __init__(): นั่นเอง
เหตุก็เพราะ python นั้นมองทุกอย่างเป็น Object (ไม่ว่าจะ numeric type ทั้งหลาย)จึงทำให้เวลาที่เรา
import package(ความจริงแล้ว import ได้ระดับ module เท่านั้นแหละ) ใดเข้ามา
ตัว interpreter จะทำการ new object ของ package นั้นและยังสามารถ access เข้าไปใน module ที่อยู่ใน
package ได้โดยใช้ object instant ของ package นั้นโดยไม่จำเป็นต้อง import module ที่ต้องการอย่างเดียว
แต่มีข้อแม้ว่าต้อง import ทุก module มาไว้ใน file __init__.py เพราะทุก module ใน package เดียวกันต้อง
เกี่ยวข้องกันซึ่งความเกี่ยวข้อง(relation)ที่ว่าในที่นี้คือการ import
Ex มี Folder หนึ่งชื่อ ma เก็บไฟล์ 2 ไฟล์ ชื่อ __init__.py,m1.py
content ของ __init__.py คือ
import m1
print "H1"
content ของ m1.py คือ
print "H2"
ใน interactive mode นั้นหากเราพิมพ์ดังนี้
>>>import ma
H2
H1
-------Restart Shell-------
>>>import ma.m1
H2
ซึ่งทั้งคำสั่ง import สองอย่างนั้นจะให้ผลคือเราสามารถใช้ module m1
ได้แต่ข้อแตกต่างอยู่ที่ว่าแบบแรกคุณจะสามารถได้ H1 หรือแต่แบบที่สองจะไม่ได้ H1
ซึ่งความน่าสนใจของ Topic ที่เขียนขึ้นมาอยู่ตรงนี้จากคำสั่งในแบบแรกถ้าเราป้อน
type(ma) เข้าไปใน shell จะไ้ด้ค่าออกมาดังนี้
>>>type(ma)
<type 'module'>
จะเห็นได้ว่าตอนแรกเรา import ระดับ package แต่กลับได้ type เป็น module
อย่างที่บอกว่าการ import จะได้ระดับสูงสุดแค่ module
ก็เพราะในกระบวนการ new object ในระดับ package นั้นตัว interpreter จะทำการ
หา constructor (เสมือน) ซึ่งก็คือ module __init__ นั่นเอง เมื่อเจอจะทำการ
new namespace ใหม่ขึ้นมาซึ่งตัว namespace นี้เก็บได้สูงสุดในระดับ module
เท่านั้นซึ่งในการ import ที่เป็นระดับ package interpreter จะ downgrade package
ให้เป็น module โดยใช้ชื่อของ module เป็นชื่อของ package นั่นเอง เสร็จและก็จะ execute
ตามคำสั่งที่เขียนไว้ใน __init__.py หรือเอาง่าย ๆ ก็คือ __init__.py
เป็น file ดังนั้น file เป็น module เวลา เมื่อ import ก็วิ่งไปที่ __init__.py ก่อน
ดังนั้นจึงเป็นการ import module เปรียบกับการ new object ของ class ครับ
สำหรับตัว namespace นี้ค่อยว่ากันคราวหลังเรื่องมันยาวมากและเป็น core หลักในการสร้าง python
ขึ้นมาเลยครับ
อดไม่ได้ คร่าว ๆ เลยนะ namespace เป็น data structure ประเภท map เก็บ<type:name>
แต่มีอีกเยอะนะอยากรู้ก็เปิดกล่องเข้าไป modify python เลย
ซึ่ง concept แบบนี้ใช้มากในกรณีที่เราต้องการใ้ช้ package
ของคนอื่นที่ compile เป็น dll แล้วหรือ ยัง