Python – packages

og:image

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 ด้วย
ตัวอย่างการใช้งาน

  1. สร้างไฟล์ “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

  2. ทำการเรียกใช้ฟังก์ชันของโมดูลใน 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 ย่อยไปจนถึงตำแหน่งของโมดูล แล้วจึงเรียกใช้งานฟังก์ชัน

  3. ทำการเรียกใช้โมดูลโดยไม่ต้องมี prefix
    from room.utils import degree_converter
    degree_converter.convert_temperature_to_fahrenheit(30)
    

    ในตัวอย่างเป็นการเรียกใช้งานฟังก์ชัน convert_temperature_to_fahrenheit ซึ่งเป็นส่วนหนึ่งของ package room โดยหากเราทำการนำเข้าโมดูลโดยใช้คีย์เวิร์ด from…import… ในรูปแบบนี้เวลาเราเรียกใช้งานฟังก์ชัน เราก็เพียงแค่อ้างถึงชื่อของโมดูลและฟังก์ชันที่ต้องการใช้งาน

  4. ทำการเรียกใช้ฟังก์ชันโดยไม่ต้องมี prefix
    from room.utils.degree_converter import convert_temperature_to_fahrenheit
    convert_temperature_to_fahrenheit(30)
    

    ในตัวอย่างเป็นการเรียกใช้งานฟังก์ชัน convert_temperature_to_fahrenheit ซึ่งเป็นส่วนหนึ่งของ package room โดยหากเราทำการนำเข้าฟังก์ชันโดยใช้คีย์เวิร์ด from…import… ในรูปแบบนี้เวลาเราเรียกใช้งานฟังก์ชัน เราก็เพียงแค่อ้างถึงชื่อของฟังก์ชันที่ต้องการใช้งาน แต่การเรียกใช้ชื่อฟังก์ชันอย่างเดียวแบบนี้อาจทำให้เกิดปัญหาได้ ในกรณีที่ชื่อฟังก์ชันนั้นมีชื่อเหมือนกันในหลายๆโมดูลที่ถูกนำเข้ามาในโปรแกรม