Python - โมดูล

โมดูลช่วยให้คุณสามารถจัดระเบียบโค้ด Python ของคุณได้อย่างมีเหตุผล การจัดกลุ่มโค้ดที่เกี่ยวข้องเป็นโมดูลทำให้เข้าใจและใช้งานโค้ดได้ง่ายขึ้น โมดูลคือออบเจ็กต์ Python ที่มีแอตทริบิวต์ที่ตั้งชื่อโดยพลการซึ่งคุณสามารถผูกและอ้างอิงได้

โมดูลคือไฟล์ที่ประกอบด้วยรหัส Python โมดูลสามารถกำหนดฟังก์ชันคลาสและตัวแปรได้ โมดูลยังสามารถรวมโค้ดที่รันได้

ตัวอย่าง

รหัสงูหลามโมดูลชื่อANAMEปกติอาศัยอยู่ในไฟล์ชื่อaname.py นี่คือตัวอย่างของโมดูลง่ายๆ support.py

def print_func( par ):
   print "Hello : ", par
   return

นำเข้าคำชี้แจง

คุณสามารถใช้ซอร์สไฟล์ Python เป็นโมดูลได้โดยเรียกใช้คำสั่ง import ในซอร์สไฟล์ Python อื่น ๆ นำเข้ามีไวยากรณ์ต่อไป -

import module1[, module2[,... moduleN]

เมื่อล่ามพบคำสั่งนำเข้าจะนำเข้าโมดูลหากมีโมดูลอยู่ในเส้นทางการค้นหา เส้นทางการค้นหาคือรายการของไดเร็กทอรีที่ล่ามค้นหาก่อนที่จะอิมพอร์ตโมดูล ตัวอย่างเช่นในการนำเข้าโมดูล support.py คุณต้องใส่คำสั่งต่อไปนี้ที่ด้านบนของสคริปต์ -

#!/usr/bin/python

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Hello : Zara

โมดูลจะถูกโหลดเพียงครั้งเดียวโดยไม่คำนึงถึงจำนวนครั้งที่นำเข้า ซึ่งจะป้องกันไม่ให้การเรียกใช้โมดูลเกิดขึ้นซ้ำแล้วซ้ำเล่าหากมีการนำเข้าหลายครั้ง

จาก ... นำเข้าคำชี้แจง

คำสั่งจาก Python ช่วยให้คุณนำเข้าแอตทริบิวต์เฉพาะจากโมดูลไปยังเนมสเปซปัจจุบัน จาก ... นำเข้ามีไวยากรณ์ต่อไป -

from modname import name1[, name2[, ... nameN]]

ตัวอย่างเช่นในการนำเข้าฟังก์ชัน fibonacci จากโมดูล fibonacci ให้ใช้คำสั่งต่อไปนี้ -

from fib import fibonacci

คำสั่งนี้ไม่ได้นำเข้าโมดูลทั้งหมดเข้าสู่เนมสเปซปัจจุบัน เพียงแค่แนะนำรายการ fibonacci จากโมดูล fib ลงในตารางสัญลักษณ์ส่วนกลางของโมดูลการนำเข้า

จาก ... นำเข้า *คำชี้แจง

นอกจากนี้ยังสามารถอิมพอร์ตชื่อทั้งหมดจากโมดูลไปยังเนมสเปซปัจจุบันโดยใช้คำสั่งนำเข้าต่อไปนี้ -

from modname import *

นี่เป็นวิธีง่ายๆในการนำเข้ารายการทั้งหมดจากโมดูลไปยังเนมสเปซปัจจุบัน อย่างไรก็ตามควรใช้คำสั่งนี้เท่าที่จำเป็น

การค้นหาโมดูล

เมื่อคุณนำเข้าโมดูลล่าม Python จะค้นหาโมดูลในลำดับต่อไปนี้ -

  • ไดเร็กทอรีปัจจุบัน

  • หากไม่พบโมดูล Python จะค้นหาแต่ละไดเร็กทอรีในตัวแปรเชลล์ PYTHONPATH

  • หากทุกอย่างล้มเหลว Python จะตรวจสอบเส้นทางเริ่มต้น บน UNIX เส้นทางเริ่มต้นนี้ปกติ / usr / local / lib / python /

เส้นทางการค้นหาโมดูลถูกเก็บไว้ในระบบโมดูลระบบเป็นไฟล์ sys.pathตัวแปร. ตัวแปร sys.path มีไดเร็กทอรีปัจจุบัน PYTHONPATH และค่าดีฟอลต์ที่ขึ้นกับการติดตั้ง

PYTHONPATHตัวแปร

PYTHONPATH เป็นตัวแปรสภาพแวดล้อมซึ่งประกอบด้วยรายการไดเร็กทอรี ไวยากรณ์ของ PYTHONPATH เหมือนกับของตัวแปรเชลล์ PATH

นี่คือ PYTHONPATH ทั่วไปจากระบบ Windows -

set PYTHONPATH = c:\python20\lib;

และนี่คือ PYTHONPATH ทั่วไปจากระบบ UNIX -

set PYTHONPATH = /usr/local/lib/python

เนมสเปซและขอบเขต

ตัวแปรคือชื่อ (ตัวระบุ) ที่แมปกับวัตถุ namespaceเป็นพจนานุกรมของชื่อตัวแปร (คีย์) และวัตถุที่สอดคล้องกันของพวกเขา (ค่า)

คำสั่งหลามสามารถเข้าถึงตัวแปรในnamespace ท้องถิ่นและในnamespace โลก หากตัวแปรโลคัลและตัวแปรโกลบอลมีชื่อเดียวกันตัวแปรโลคัลจะเงาตัวแปรโกลบอล

แต่ละฟังก์ชันมีเนมสเปซในเครื่องของตนเอง วิธีการของคลาสเป็นไปตามกฎการกำหนดขอบเขตเช่นเดียวกับฟังก์ชันทั่วไป

Python ทำให้การคาดเดาอย่างมีความรู้ว่าตัวแปรเป็นแบบท้องถิ่นหรือทั่วโลก ถือว่าตัวแปรที่กำหนดค่าในฟังก์ชันเป็นแบบโลคัล

ดังนั้นในการกำหนดค่าให้กับตัวแปรส่วนกลางภายในฟังก์ชันคุณต้องใช้คำสั่ง global ก่อน

คำสั่งglobal VarNameบอก Python ว่า VarName เป็นตัวแปรส่วนกลาง Python หยุดค้นหาเนมสเปซภายในสำหรับตัวแปร

ตัวอย่างเช่นเรากำหนดตัวแปรMoneyในเนมสเปซส่วนกลาง ภายในฟังก์ชันMoneyเรากำหนดMoneyเป็นค่าดังนั้น Python จึงถือว่าMoneyเป็นตัวแปรภายใน อย่างไรก็ตามเราเข้าถึงค่าของตัวแปรท้องถิ่นMoneyก่อนที่จะตั้งค่าดังนั้นผลลัพธ์ UnboundLocalError การไม่ใส่ข้อคิดเห็นในคำสั่งส่วนกลางช่วยแก้ปัญหาได้

#!/usr/bin/python

Money = 2000
def AddMoney():
   # Uncomment the following line to fix the code:
   # global Money
   Money = Money + 1

print Money
AddMoney()
print Money

ฟังก์ชัน dir ()

ฟังก์ชันในตัว dir () ส่งคืนรายการสตริงที่เรียงลำดับที่มีชื่อที่กำหนดโดยโมดูล

รายการประกอบด้วยชื่อของโมดูลตัวแปรและฟังก์ชันทั้งหมดที่กำหนดไว้ในโมดูล ต่อไปนี้เป็นตัวอย่างง่ายๆ -

#!/usr/bin/python

# Import built-in module math
import math

content = dir(math)
print content

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
'sqrt', 'tan', 'tanh']

ในที่นี้ตัวแปรสตริงพิเศษ__name__คือชื่อของโมดูลและ __file__คือชื่อไฟล์ที่โมดูลถูกโหลด

Globals ()และชาวบ้าน ()ฟังก์ชั่น

ฟังก์ชันglobals ()และlocal ()สามารถใช้เพื่อส่งคืนชื่อในเนมสเปซส่วนกลางและโลคัลขึ้นอยู่กับตำแหน่งที่เรียก

ถ้า local () ถูกเรียกจากภายในฟังก์ชันจะส่งคืนชื่อทั้งหมดที่สามารถเข้าถึงได้จากฟังก์ชันนั้น

ถ้า globals () ถูกเรียกจากภายในฟังก์ชันจะส่งคืนชื่อทั้งหมดที่สามารถเข้าถึงได้ทั่วโลกจากฟังก์ชันนั้น

ประเภทการส่งคืนของฟังก์ชันทั้งสองนี้คือพจนานุกรม ดังนั้นจึงสามารถแยกชื่อได้โดยใช้ฟังก์ชัน keys ()

โหลด ()ฟังก์ชั่น

เมื่อโมดูลถูกนำเข้าสู่สคริปต์โค้ดในส่วนระดับบนสุดของโมดูลจะถูกเรียกใช้เพียงครั้งเดียว

ดังนั้นหากคุณต้องการเรียกใช้โค้ดระดับบนสุดในโมดูลอีกครั้งคุณสามารถใช้ฟังก์ชันreload () ฟังก์ชั่น reload () จะนำเข้าโมดูลที่นำเข้าก่อนหน้านี้อีกครั้ง ไวยากรณ์ของฟังก์ชัน reload () คือ -

reload(module_name)

ที่นี่module_nameคือชื่อของโมดูลที่คุณต้องการโหลดซ้ำไม่ใช่สตริงที่มีชื่อโมดูล ตัวอย่างเช่นในการโหลดโมดูลhelloซ้ำให้ทำดังต่อไปนี้ -

reload(hello)

แพ็คเกจใน Python

แพ็กเกจคือโครงสร้างไดเร็กทอรีไฟล์แบบลำดับชั้นที่กำหนดสภาวะแวดล้อมแอ็พพลิเคชัน Python เดียวที่ประกอบด้วยโมดูลและแพ็กเกจย่อยและแพ็กเกจย่อยและอื่น ๆ

พิจารณาไฟล์Pots.py ที่ มีอยู่ในสมุดโทรศัพท์ ไฟล์นี้มีซอร์สโค้ดบรรทัดต่อไปนี้ -

#!/usr/bin/python

def Pots():
   print "I'm Pots Phone"

ในทำนองเดียวกันเรามีอีกสองไฟล์ที่มีฟังก์ชั่นต่างกันโดยมีชื่อเดียวกันกับด้านบน -

  • ไฟล์Phone / Isdn.py ที่มีฟังก์ชัน Isdn ()

  • โทรศัพท์ /ไฟล์G3.py ที่มีฟังก์ชัน G3 ()

ตอนนี้สร้างไฟล์ __init__.py อีกหนึ่งไฟล์ในสมุดโทรศัพท์ -

  • Phone/__init__.py

ในการทำให้ฟังก์ชันทั้งหมดของคุณพร้อมใช้งานเมื่อคุณนำเข้าโทรศัพท์คุณต้องใส่คำสั่งการนำเข้าอย่างชัดเจนใน __init__.py ดังต่อไปนี้ -

from Pots import Pots
from Isdn import Isdn
from G3 import G3

หลังจากที่คุณเพิ่มบรรทัดเหล่านี้ใน __init__.py คุณจะมีคลาสเหล่านี้ทั้งหมดเมื่อคุณนำเข้าแพ็คเกจโทรศัพท์

#!/usr/bin/python

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone

ในตัวอย่างข้างต้นเราได้ยกตัวอย่างฟังก์ชันเดียวในแต่ละไฟล์ แต่คุณสามารถเก็บฟังก์ชันต่างๆไว้ในไฟล์ของคุณได้ คุณยังสามารถกำหนดคลาส Python ต่างๆในไฟล์เหล่านั้นจากนั้นคุณสามารถสร้างแพ็คเกจของคุณจากคลาสเหล่านั้นได้