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 ต่างๆในไฟล์เหล่านั้นจากนั้นคุณสามารถสร้างแพ็คเกจของคุณจากคลาสเหล่านั้นได้