Python – packages
การจัดเก็บข้อมูลลงคอมพิวเตอร์ก็เหมือนการจัดเก็บข้อมูลในรูปแบบอื่น เมื่อมีข้อมูลเยอะขึ้น มีทรัพยากรเยอะขึ้น เราก็จำเป็นต้องมีการจัดหมวดหมู่ของข้อมูลให้เป็นระเบียบ เพื่อที่จะช่วยให้เราสามารถทำงานได้สะดวกและรวดเร็วขึ้น การจัดหมวดหมู่และแยกย่อยไฟล์ที่เรามีอยู่ ทำให้เราสามารถสืบค้นไฟล์เหล่านั้นได้รวดเร็วขึ้นและไม่จำเป็นต้องเสียเวลาในการสร้างข้อมูลใหม่หากมีข้อมูลดังกล่าวจัดเก็บอยู่แล้ว
เมื่อเราจะต้องทำการจัดระเบียบข้อมูล เราก็สามารถเริ่มต้นจากทำการจัดรูปแบบโดยการจัดกลุ่มของไฟล์แยกย่อยเป็นโฟลเดอร์และภายในโฟลเดอร์ดังกล่าวก็อาจจะมีไฟล์หรือโฟลเดอร์อื่นๆ ซ้อนกันไปเรื่อยๆ ตามความเกี่ยวเนื่องกันของข้อมูล
สำหรับไฟล์ที่ทำงานในลักษณะใกล้เคียงกันก็ถูกจัดวางไว้ในโฟลเดอร์เดียวกัน ตัวอย่างเช่น เราเก็บไฟล์ที่บันทึกรูปภาพไว้ในโฟลเดอร์ชื่อว่า “pictures” และภายในโฟลเดอร์ดังกล่าวเราอาจจะมีโฟลเดอร์ย่อย ที่ระบุชื่อปีที่ทำการบันทึกรูปภาพ
pictures
—-2012
——–January
————IMG_0001.JPG
————IMG_0002.JPG
————IMG_0003.JPG
————IMG_0004.JPG
————IMG_0005.JPG
——–February
——–March
——–April
—-2013
—-2014
—-2015
โดยจากตัวอย่าง จะทำการจัดเก็บไฟล์รูปภาพไว้ในโฟลเดอร์ pictures โดยในโฟลเดอร์ pictures นั้นก็สร้างโฟลเดอร์ย่อยโดยแยกรูปภาพตามปีคริสตศักราช(ค.ศ.) และในโฟลเดอร์ย่อยนั้น ข้อมูลรูปภาพแต่ละปีก็ยังแยกย่อยการเก็บข้อมูลรูปภาพ ตามเดือนที่ภาพถูกบันทึกไว้
จากการจัดเก็บข้อมูลในคอมพิวเตอร์ ด้วยรูปแบบเดียวกันนี้ เรานำวิธีดังกล่าวมาใช้จัดการ “package” ใน python ยิ่งโปรแกรมมีความสามารถมากขึ้นและทำงานซับซ้อนขึ้น จำนวนคำสั่ง, ตัวแปร, ฟังก์ชันและจำนวนไฟล์ที่บรรจุคำสั่งก็จะมีจำนวนมากขึ้นตามไปด้วย การจัดกลุ่มไฟล์ที่บรรจุคำสั่งออกเป็นโฟลเดอร์ย่อยๆ ตามลักษณะการทำงานนั้น ก็คือ รูปแบบของการจัดการ “packages”
โดยปกติแล้วในโฟลเดอร์หนึ่ง จะสามารถสร้างโฟลเดอร์ย่อยๆ ซ้อนกันไปได้เรื่อยๆ ได้เพื่อจัดเก็บข้อมูล ดังที่กล่าวไปแล้วในข้างต้น เช่นเดียวกันกับการจัดการ package ที่เราสามารถสร้าง package ย่อยๆหรือเรียกว่า sub-package ไว้ภายใน package หลักได้ตามลักษณะการทำงานของโมดูลย่อยๆนั้น
สำหรับการจัดเก็บโมดูลต่างๆ ให้อยู่ในรูปแบบของ package สำหรับ python นั้น แต่ละโฟลเดอร์ที่บรรจุโมดูลต่างๆ เอาไว้ จะจัดเป็น package ได้จะต้องบรรจุไฟล์ __init.py__ เพื่อระบุว่าโฟลเดอร์ดังกล่าวถือเป็น package โดยไฟล์นี้อาจจะถูกปล่อยให้ว่างไว้หรืออาจจะบรรจุคำสั่งบางอย่างเอาไว้
room
—-__init__.py
—-utils
——–__init__.py
——–degree_converter.py
—-controls
——–__init__.py
——–sensor_automate.py
——–sensor_manual.py
—-data_analyzer.py
—-data_collector.py
การเรียกใช้โมดูลใน package
เราสามารถเรียกใช้โมดูลจาก package โดยคั่นข้อมูลของชื่อ package และชื่อโมดูลโดยใช้เครื่องหมาย “.” แต่ก็อาจจะมีรูปแบบการเรียกต่างกันไปขึ้นอยู่กับวิธีที่เรานำเข้า package ด้วย
ตัวอย่างการใช้งาน
- สร้างไฟล์ “degree_converter.py” แล้วทำการจัดเก็บให้อยู่ในโครงสร้างของ package ตามตัวอย่างข้างต้น
room > utils > degree_converter.py#!/usr/bin/env python # -*- coding: utf-8 -*- #ฟังก์ชันสำหรับแปลงอุณหภูมิจากหน่วยองศาเซลเซียสเป็นองศาฟาเรนต์ไฮต์ def convert_temperature_to_fahrenheit(degree_celcius): degree_fahrenheit = degree_celcius * (9.0/5.0) + 32 return degree_fahrenheit # ฟังก์ชันสำหรับแปลงอุณหภูมิจากหน่วยจากองศาฟาเรนต์เป็นไฮต์องศาเซลเซียส def convert_temperature_to_celcius(degree_fahrenheit): degree_celcius = (degree_fahrenheit - 32) * (5.0/9.0) return degree_celcius
ในตัวอย่างเป็นการสร้างโมดูลชื่อ “degree_converter” โดยโมดูลนี้เป็นส่วนหนึ่งของ package ชื่อ room และอยู่ใน sub-package ชื่อ util
- ทำการเรียกใช้ฟังก์ชันของโมดูลใน package แบบเต็ม
import room.utils.degree_converter room.utils.degree_converter.convert_temperature_to_fahrenheit(30)
ในตัวอย่างเป็นการเรียกใช้งานฟังก์ชัน convert_temperature_to_fahrenheit ซึ่งเป็นส่วนหนึ่งของ package room โดยหากเราทำการนำเข้าโมดูลโดยใช้คีย์เวิร์ด import เวลาเราเรียกใช้ เราก็ต้องอ้างถึงชื่อ package, sub-package ย่อยไปจนถึงตำแหน่งของโมดูล แล้วจึงเรียกใช้งานฟังก์ชัน
- ทำการเรียกใช้โมดูลโดยไม่ต้องมี prefix
from room.utils import degree_converter degree_converter.convert_temperature_to_fahrenheit(30)
ในตัวอย่างเป็นการเรียกใช้งานฟังก์ชัน convert_temperature_to_fahrenheit ซึ่งเป็นส่วนหนึ่งของ package room โดยหากเราทำการนำเข้าโมดูลโดยใช้คีย์เวิร์ด from…import… ในรูปแบบนี้เวลาเราเรียกใช้งานฟังก์ชัน เราก็เพียงแค่อ้างถึงชื่อของโมดูลและฟังก์ชันที่ต้องการใช้งาน
- ทำการเรียกใช้ฟังก์ชันโดยไม่ต้องมี prefix
from room.utils.degree_converter import convert_temperature_to_fahrenheit convert_temperature_to_fahrenheit(30)
ในตัวอย่างเป็นการเรียกใช้งานฟังก์ชัน convert_temperature_to_fahrenheit ซึ่งเป็นส่วนหนึ่งของ package room โดยหากเราทำการนำเข้าฟังก์ชันโดยใช้คีย์เวิร์ด from…import… ในรูปแบบนี้เวลาเราเรียกใช้งานฟังก์ชัน เราก็เพียงแค่อ้างถึงชื่อของฟังก์ชันที่ต้องการใช้งาน แต่การเรียกใช้ชื่อฟังก์ชันอย่างเดียวแบบนี้อาจทำให้เกิดปัญหาได้ ในกรณีที่ชื่อฟังก์ชันนั้นมีชื่อเหมือนกันในหลายๆโมดูลที่ถูกนำเข้ามาในโปรแกรม
