โมดูลหลาม
โมดูลช่วยให้คุณสามารถจัดระเบียบเหตุผลรหัสหลามของคุณ
การกำหนดรหัสที่เกี่ยวข้องเข้าไปในโมดูลที่จะทำให้รหัสของคุณง่ายต่อการใช้ที่เข้าใจมากขึ้น
โมดูลหลามเป็นวัตถุที่มีคุณลักษณะแบบสุ่มชื่อที่ใช้ในการผูกหรือการอ้างอิง
เพียงแค่ใส่โมดูลเป็นรหัสหลามเพื่อบันทึกไฟล์ โมดูลสามารถกำหนดฟังก์ชั่นการเรียนและตัวแปร โมดูลสามารถมีรหัสปฏิบัติการ
ตัวอย่าง
โมดูล ANAME เรียกว่าในรหัสหลามทั่วไปสามารถพบได้ในไฟล์ที่เรียกว่า aname.py ตัวอย่างต่อไปนี้เป็น support.py โมดูลที่เรียบง่าย
def print_func( par ): print "Hello : ", par return
คำสั่งนำเข้า
ต้องการใช้แฟ้มแหล่งที่มางูใหญ่เพียงแค่ทำการคำสั่งนำเข้าอีกในแฟ้มต้นฉบับไวยากรณ์เป็นดังนี้:
import module1[, module2[,... moduleN]
เมื่อล่ามพบคำสั่งนำเข้าถ้าโมดูลจะถูกนำเข้าในเส้นทางการค้นหาปัจจุบัน
เส้นทางการค้นหาเป็นล่ามแรกจะค้นหารายชื่อของไดเรกทอรีทั้งหมด ตามที่คุณต้องการที่จะนำเข้า support.py โมดูลคุณจะต้องใส่คำสั่งที่ด้านบนของสคริปต์:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 导入模块 import support # 现在可以调用模块里包含的函数了 support.print_func("Zara")
ตัวอย่างของการส่งออกดังกล่าวข้างต้น:
Hello : Zara
โมดูลจะถูกนำเข้าครั้งเดียวไม่ว่ากี่ครั้งที่คุณดำเนินการนำเข้า โมดูลนี้จะช่วยป้องกันการนำเข้าที่จะดำเนินการซ้ำแล้วซ้ำอีก
จาก ... คำสั่งนำเข้า
งูหลามช่วยให้คุณสามารถนำงบจากส่วนที่ระบุจากโมดูลเข้าไปใน namespace ปัจจุบัน ไวยากรณ์เป็นดังนี้:
from modname import name1[, name2[, ... nameN]]
ยกตัวอย่างเช่นการที่จะนำเข้าฟังก์ชั่น fibonacci โมดูลตอแหลใช้คำสั่งต่อไปนี้:
from fib import fibonacci
คำสั่งนี้ไม่ปดโมดูลทั้งหมดลงใน namespace ที่ปัจจุบันก็จะปดเลน fibonacci นำเข้าสู่การดำเนินงานตารางสัญลักษณ์เดียวทั่วโลกของโมดูลประกาศนี้
จาก ... นำเข้าคำสั่ง *
เนื้อหาทั้งหมดของโมดูลที่มีอยู่ทั้งหมดลงใน namespace ปัจจุบันเป็นไปได้เพียงแค่ใช้คำสั่งต่อไปนี้:
from modname import *
นี้มีวิธีที่ง่ายที่จะนำเข้าโมดูลในโครงการทั้งหมด อย่างไรก็ตามคำสั่งนี้ไม่ควรมากเกินไปที่จะใช้
โมดูลการวางตำแหน่ง
เมื่อคุณนำเข้าโมดูลหลาม parser โมดูลตำแหน่งเพื่อค้นหาคือ:
- ไดเรกทอรีปัจจุบัน
- ถ้าไม่ได้อยู่ในไดเรกทอรีปัจจุบันงูหลามจะค้นหาแต่ละ directory ในเปลือก PYTHONPATH ตัวแปร
- ถ้าคุณไม่สามารถหางูใหญ่จะมองไปที่เส้นทางเริ่มต้น ภายใต้ระบบปฏิบัติการยูนิกซ์เส้นทางเริ่มต้นมักจะเป็น / usr / local / lib / หลาม /
เส้นทางการค้นหาโมดูลถูกเก็บไว้ใน sys.path โมดูลตัวแปรระบบ ตัวแปรที่มีไดเรกทอรีปัจจุบัน PYTHONPATH และไดเรกทอรีการติดตั้งเริ่มต้นโดยกระบวนการตัดสินใจ
ตัวแปร PYTHONPATH
ในฐานะที่เป็นตัวแปรสภาพแวดล้อม PYTHONPATH โดยติดอยู่ในรายชื่อของหลายไดเรกทอรีที่ PYTHONPATH เปลือกไวยากรณ์ PATH ตัวแปรเดียวกัน
บนระบบ Windows ที่ PYTHONPATH ทั่วไปดังนี้
set PYTHONPATH=c:\python20\lib;
บนระบบ UNIX ที่ PYTHONPATH ทั่วไปดังนี้
set PYTHONPATH=/usr/local/lib/python
Namespaces และขอบเขต
ตัวแปรที่เป็นชื่อของวัตถุที่มีการจับคู่ (ระบุ) namespace เป็นตัวแปรที่มีชื่อของ (กุญแจ) ของพวกเขาและวัตถุที่เกี่ยวข้องเป็น (ค่า) ของพจนานุกรม
นิพจน์งูใหญ่สามารถเข้าถึงตัวแปร namespace namespace ประเทศและทั่วโลก ถ้าตัวแปรท้องถิ่นที่มีชื่อเดียวกับตัวแปรทั่วโลกตัวแปรท้องถิ่นจะแทนที่ตัวแปรทั่วโลก
แต่ละฟังก์ชั่นมี namespace ของตัวเอง กฎขอบเขตเป็นวิธีการเรียนและการทำงานได้ตามปกติ
งูหลามชาญฉลาดเดาตัวแปรเป็นในประเทศหรือทั่วโลกก็จะสันนิษฐานได้ว่าตัวแปรใด ๆ ในการกำหนดฟังก์ชั่นเป็นท้องถิ่น
ดังนั้นถ้าคุณได้รับมอบหมายให้ตัวแปรทั่วโลกในการทำงานของคุณจะต้องใช้คำสั่งทั่วโลก
การแสดงออก VarName ทั่วโลกบอกหลาม VarName เป็นตัวแปรทั่วโลกเพื่อให้งูหลามไม่พบตัวแปรนี้ใน namespace ท้องถิ่น
ตัวอย่างเช่นเรากำหนดเงินตัวแปรใน namespace โลก จากนั้นเราภายในฟังก์ชั่นที่กำหนดให้กับตัวแปรเงินแล้วงูหลามจะถือว่าเงินที่เป็นตัวแปรท้องถิ่น อย่างไรก็ตามเราไม่ได้ประกาศตัวแปรท้องถิ่นก่อนที่จะเข้าถึงเงินผลที่ได้คือว่าจะมีความผิดพลาด UnboundLocalError การยกเลิกคำสั่งความคิดเห็นทั่วโลกสามารถแก้ปัญหานี้
#!/usr/bin/python # -*- coding: UTF-8 -*- Money = 2000 def AddMoney(): # 想改正代码就取消以下注释: # global Money Money = Money + 1 print Money AddMoney() print Money
dir () ฟังก์ชัน
dir () ฟังก์ชั่นเป็นรายการของสตริงแถวลำดับที่ดีเนื้อหาเป็นโมดูลกำหนดชื่อ
กลับรายการของโมดูลทั้งหมดเพื่อรองรับตัวแปรและฟังก์ชั่นที่กำหนดไว้ในโมดูล ตัวอย่างง่ายๆดังต่อไปนี้:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 导入内置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 () และชาวบ้าน () ฟังก์ชั่นที่สามารถใช้ในการแสดงชื่อ namespace ระดับโลกและระดับท้องถิ่น
ถ้าคุณเรียกชาวบ้านที่อยู่ภายในฟังก์ชั่น () ผลตอบแทนที่สามารถเข้าถึงฟังก์ชั่นทั้งหมดในชื่อ
ถ้าคุณเรียก Globals () ภายในฟังก์ชันจะส่งกลับทั้งหมดชื่อฟังก์ชั่นในการเข้าถึงพลังงานทั่วโลก
ฟังก์ชั่นทั้งสองกลับเป็นประเภทพจนานุกรม ดังนั้นชื่อที่เราใช้กุญแจ () ฟังก์ชั่นการกำจัด
โหลด () ฟังก์ชัน
เมื่อโมดูลถูกนำมาใช้เป็นส่วนหนึ่งโมดูลสคริปต์ด้านบนของรหัสที่จะดำเนินการเพียงครั้งเดียว
ดังนั้นถ้าคุณต้องการที่จะดำเนินการอีกครั้งโมดูลในส่วนด้านบนของรหัสที่คุณสามารถใช้โหลด () ฟังก์ชัน ฟังก์ชั่นนี้จะได้รับอีกครั้งก่อนที่จะนำเข้าโมดูลที่นำเข้า ไวยากรณ์เป็นดังนี้:
reload(module_name)
นี่ชื่อ module_name ของโมดูลที่จะวางโดยตรงแทนของสตริง ตัวอย่างเช่นคุณต้องการแทนที่โมดูลสวัสดีดังต่อไปนี้:
reload(hello)
แพ็คหลาม
แพคเกจที่เป็นโครงสร้างไดเรกทอรีลำดับชั้นซึ่งกำหนดแพคเกจเด็กโดยโมดูลและแพคเกจย่อยและแพ็กเกจย่อยภายใต้ส่วนประกอบอื่น ๆ ของสภาพแวดล้อมที่ใช้งูหลาม
พิจารณาไฟล์ pots.py ในสมุดโทรศัพท์ ไฟล์นี้มีรหัสที่มาต่อไปนี้:
#!/usr/bin/python # -*- coding: UTF-8 -*- def Pots(): print "I'm Pots Phone"
ในทำนองเดียวกันเรามีสองฟังก์ชั่นที่แตกต่างกันเพื่อบันทึกไฟล์:
- โทรศัพท์ / Isdn.py ที่มีฟังก์ชั่น Isdn ()
- โทรศัพท์ / G3.py ที่มีฟังก์ชั่น G3 ()
ตอนนี้สร้าง __init__.py แฟ้มในสมุดโทรศัพท์:
- โทรศัพท์ / __ init__.py
เมื่อคุณนำเข้าโทรศัพท์เพื่อให้สามารถใช้ฟังก์ชั่นทั้งหมดที่คุณจำเป็นต้องใช้งบนำเข้าอย่างชัดเจนในปีที่ผ่าน __init__.py ดังต่อไปนี้:
from Pots import Pots from Isdn import Isdn from G3 import G3
เมื่อคุณเพิ่มรหัสเพื่อ __init__.py แพคเกจโทรศัพท์นำเข้าเมื่อชั้นเรียนเหล่านี้ทั้งหมดที่มีอยู่ใน
#!/usr/bin/python # -*- coding: UTF-8 -*- # 导入 Phone 包 import Phone Phone.Pots() Phone.Isdn() Phone.G3()
ตัวอย่างของการส่งออกดังกล่าวข้างต้น:
I'm Pots Phone I'm 3G Phone I'm ISDN Phone
ตัวอย่างเช่นเรามีเพียงหนึ่งฟังก์ชั่นในแต่ละไฟล์ แต่ในความเป็นจริงคุณสามารถใส่จำนวนมากของฟังก์ชั่น นอกจากนี้คุณยังสามารถกำหนดระดับหลามในไฟล์เหล่านี้และจากนั้นสร้างแพคเกจสำหรับการเรียนเหล่านี้