子產品是用來組織python代碼的方法,而包則是用來組織子產品的。
一個檔案被看作一個獨立的子產品,一個子產品也可以被看作是一個檔案。子產品的檔案名就是子產品的名字加上擴充名.py。
一個名稱空間就是一個從名稱到對象的關系映射集合。
子產品的導入需要一個叫做“路徑搜尋”的過程。
搜尋路徑在不同系統下一般是不同的。
使用sys.modules可以找到目前導入了哪些子產品和它們來自什麼地方。
和sys.path不同,sys.modules是一個字典,使用子產品名作為鍵(key),對應實體位址作為值(value)。
改變了一個名字的綁定叫做重新綁定,删除一個名字叫做解除綁定。
python解釋器首先加載内建名稱空間。随後加載執行子產品的全局名稱空間,他會在子產品開始執行後變為活動名稱空間。
如果在執行期間調用了一個函數,那麼将建立出第三個名稱空間,即局部名稱空間。可以通過globals()和locals()内建函數判斷出某一名字屬于哪個名稱空間。
首先從局部名稱空間開始,如果沒有找到,解釋器将繼續查找全局名稱空間。如果這也失敗了,它将在内建名稱空間裡查找。
推薦導入子產品的順序:
1、标準庫子產品
2、第三方子產品
3、應用程式自定義子產品
加載子產品會導緻這個子產品被“執行”。也就是被導入子產品的頂層代碼将直接被執行。
應該把盡可能多的代碼封裝到函數。
python加入的一個新特性允許你把一個已經安裝的子產品作為腳本執行。
一個子產品隻被加載一次,無論它被導入多少次。加載隻在第一次導入時發生。
隻從子產品導入名字的另一個副作用是那些名字會成為局部名稱空間的一部分。綁定隻是局部的而不是整個名稱空間。
解決辦法是使用import和完整的辨別符名稱。
隻import__future__不會有任何變化。必須顯示地導入指定特性。
程式員應該有從python程式或是C中釋出警告的能力。
警告會有一個預設的輸出顯示到sys.stderr。當運作會引發警告的python腳本時,可以jilu它的輸出記錄到日志檔案中,而不是直接顯示給終端使用者。python還提供一個可以操作警告過濾器的API。
指令行也可以控制警告過濾器。
如果你的搜尋路徑中存在一個包含python子產品的.zip檔案,導入時會zip檔案當作目錄處理,在檔案中搜尋子產品。
如果一個zip歸檔沒有比對的.pyc檔案時,導入速度會相對慢一點。
__import__(module_name[,globals[,locals[,fromlist]]])
sys=__import__('sys')
globals()和locals()内建函數分别傳回調用者全局和局部名稱空間的字典。
在全局名稱空間下,globals()和locals()傳回相同的字典。
reload()内建函數可以重新導入一個已經導入的子產品。首先子產品必須是全部導入,而且必須是被成功導入。另外參數必須是子產品自身而不是包含子產品名的字元串。
子產品中的代碼在導入時被執行,但隻執行一次。以後執行import語句不會再次執行這些代碼,隻是綁定子產品名稱。而reload()函數不同。
包是一個有層次的檔案目錄結構,它定義一個由子產品和子包組成的python應用程式執行環境。包使用句點屬性辨別來通路他們的元素。使用标準的import和form-import語句導入包中的子產品。
__init__.py 初始化子產品
from-import語句導入子包時需要使用到它。如果沒有用到,他們可以是空檔案。
所有的導入現在都被認為是絕對的,也就是說這些名字必須通過python路徑來通路。
相對導入隻應用于from-import語句。
當python解釋器在标準模式下啟動時,一些子產品會被解釋器自動導入,用于系統相關操作。
如果你不想讓某個子產品屬性被“from module import *”導入,那麼你可以給你不想導入的屬性名稱加上一個下劃線。不過如果你導入了整個子產品或是你顯式地導入某個屬性,這個隐藏資料的方法就不起作用。
本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1960333,如需轉載請自行聯系原作者