Dave Python 練習十四 — 模組

來源:互聯網
上載者:User

#encoding=utf-8<br />## ***************** 模組 *************************</p><p>## ********** Part 1: 什麼是模組 **************<br />#模組支援從邏輯上組織 Python 代碼。 當代碼量變得相當大的時候, 我們最好把代碼分成一<br />#些有組織的程式碼片段,前提是保證它們的彼此互動。 這些程式碼片段相互間有一定的聯絡, 可能是一個<br />#包含資料成員和方法的類, 也可能是一組相關但彼此獨立的操作函數。 這些程式碼片段是共用的,所以<br />#Python 允許 "調入" 一個模組, 允許使用其他模組的屬性來利用之前的工作成果, 實現代碼重用.<br />#這個把其他模組中屬性附加到你的模組中的操作叫做匯入(import) 。那些自我包含並且有組織的代<br />#碼片斷就是模組( module )。</p><p>#模組是用來組織 Python 代碼的方法, 而包則是用來組織模組的。</p><p>## ********** Part 2: 模組和檔案 **************<br />#如果說模組是按照邏輯來組織 Python 代碼的方法, 那麼檔案便是物理層上組織模組的方法。<br />#因此, 一個檔案被看作是一個獨立模組, 一個模組也可以被看作是一個檔案。 模組的檔案名稱就是模<br />#塊的名字加上副檔名 .py 。與其它可以匯入類(class)的語言不同,在 Python 中你匯入的是模組或模組屬性。</p><p>## 2.1 模組名稱空間<br />#一個名稱空間就是一個從名稱到對象的關係映射集合。模組名稱是它們的屬性名稱中的一個重要部分。 例如<br />#string 模組中的 atoi() 函數就是 string.atoi() 。給定一個模組名之後, 只可能有一個模組被<br />#匯入到 Python 解譯器中, 所以在不同模組間不會出現名稱交叉現象; 所以每個模組都定義了它自<br />#己的唯一的名稱空間。 如果我在我自己的模組 mymodule 裡建立了一個 atoi() 函數, 那麼它的名<br />#字應該是 mymodule.atoi() 。 所以即使屬性之間有名稱衝突, 但它們的完整授權名稱(fully<br />#qualified name)——通過句點屬性標識指定了各自的名稱空間 - 防止了名稱衝突的發生。</p><p>## 2.2 搜尋路徑和路徑搜尋</p><p>#模組的匯入需要一個叫做"路徑搜尋"的過程。 即在檔案系統"預定義地區"中尋找 mymodule.py<br />#檔案(如果你匯入 mymodule 的話)。 這些預定義地區只不過是你的 Python 搜尋路徑的集合。路徑<br />#搜尋和搜尋路徑是兩個不同的概念, 前者是指尋找某個檔案的操作, 後者是去尋找一組目錄。 有時<br />#候匯入模組操作會失敗:<br />#>>> import xxx<br />#Traceback (innermost last):<br />#File "<interactive input>", line 1, in ?<br />#ImportError: No module named xxx</p><p>#發生這樣的錯誤時, 解譯器會告訴你它無法訪問請求的模組, 可能的原因是模組不在搜尋路<br />#徑裡, 從而導致了路徑搜尋的失敗。<br />#預設搜尋路徑是在編譯或是安裝時指定的。 它可以在一個或兩個地方修改。<br />#一個是啟動 Python 的 shell 或命令列的 PYTHONPATH 環境變數。 該變數的內容是一組用冒<br />#號分割的目錄路徑。 如果你想讓解譯器使用這個變數, 那麼請確保在啟動解譯器或執行 Python 腳<br />#本前設定或修改了該變數。<br />#解譯器啟動之後, 也可以訪問這個搜尋路徑, 它會被儲存在 sys 模組的 sys.path 變數裡。<br />#不過它已經不是冒號分割的字串, 而是包含每個獨立路徑的列表。下面是一個 Unix 機器搜尋路<br />#徑的範例。切記, 搜尋路徑在不同系統下一般是不同的。</p><p>#import sys<br />#print(sys.path)<br />#--><br />#['E:\\MyEclipseWorkplace\\MyPython\\src\\Practice', 'E:\\MyEclipseWorkplace\\MyPython\\src',<br />#'C:\\Python32\\DLLs', 'C:\\Python32\\lib', 'C:\\Python32', 'C:\\Python32\\lib\\site-packages',<br />#'C:\\Windows\\system32\\python32.zip']</p><p>#這隻是個列表, 所以我們可以隨時隨地對它進行修改。 如果你知道你需要匯入的模組是什麼,<br />#而它的路徑不在搜尋路徑裡, 那麼只需要調用列表的 append() 方法即可, 就像這樣:<br />#import sys<br />#sys.path.append('D:\\Dave')<br />#print(sys.path)</p><p>#使用 sys.modules 可以找到當前置入了哪些模組和它們來自什麼地方。 和 sys.path 不同,<br />#sys.modules 是一個字典, 使用模組名作為鍵( key) , 對應物理地址作為值( value )。</p><p>## ********** Part 3: 名稱空間 **************<br />#名稱空間是名稱(標識符)到對象的映射。 向名稱空間添加名稱的操作過程涉及到綁定標識符到<br />#指定對象的操作(以及給該對象的引用計數加 1 )</p><p>#在執行期間有兩個或三個活動的名稱空間。 這三個名稱空間分別是局部名稱空間, 全域名稱空間和內建名稱空間,<br /># 但局部名稱空間在執行期間是不斷變化的, 所以我們說"兩個或三個"。 從名稱空間中訪問這些名字依賴於它們的載入順序,<br /># 或是系統載入這些名稱空間的順序。</p><p>#Python 解譯器首先載入內建名稱空間。 它由 __builtins__ 模組中的名字構成。 隨後載入執<br />#行模組的全域名稱空間, 它會在模組開始執行後變為活動名稱空間。 這樣我們就有了兩個活動的名稱空間。</p><p>#核心筆記: __builtins__ 和 __builtin__<br />#__builtins__ 模組和 __builtin__ 模組不能混淆。__builtins__ 模組包含內建名稱空間中內建名字的集合。<br />#其中大多數(如果不是全部的話)來自 __builtin__ 模組, 該模組包含內建函數, 異常以及其他屬性。<br />#在標準 Python 執行環境下,__builtins__ 包含 __builtin__ 的所有名字。</p><p>#如果在執行期間調用了一個函數, 那麼將建立出第三個名稱空間, 即局部名稱空間。 我們可以<br />#通過 globals() 和 locals() 內建函數判斷出某一名字屬於哪個名稱空間。</p><p>## 3.1 名稱空間與變數範圍比較<br />#名稱空間是純粹意義上的名字和對象間的映射關係, 而範圍還指出了從使用者代碼的哪些物理位置可以訪問到這些名字。</p><p>#注意每個名稱空間是一個自我包含的單元。但從範圍的觀點來看, 事情是不同的. 所有局部<br />#名稱空間的名稱都在局部作用範圍內。局部作用範圍以外的所有名稱都在全域作用範圍內。</p><p>#在程式執行過程中, 局部名稱空間和範圍會隨函數調用而不斷變化, 而全域名稱空間是不變的。</p><p>## 3.2 名稱尋找, 確定範圍, 覆蓋<br />#訪問一個屬性時, 解譯器必須在三個名稱空間中的一個找到它。 首先從局部名稱空間開始, 如果沒有找到, 解釋<br />#器將繼續尋找全域名稱空間. 如果這也失敗了, 它將在內建名稱空間裡尋找。 如果最後的嘗試也失敗了, 你會得到這樣的錯誤:<br />#>>> foo<br />#Traceback (innermost last): File "<stdin>", line 1, in ?<br />#NameError: foo<br />#這個錯誤資訊體現了先尋找的名稱空間是如何"遮蔽"其他後搜尋的名稱空間的。 這體現了名稱覆蓋的影響。</p><p>## 3.3 無限制的名稱空間<br />#Python 的一個有用的特性在於你可以在任何需要放置資料的地方獲得一個名稱空間。</p><p>## ********** Part 4: 匯入模組 **************</p><p>## 4.1 語句<br />#使用 import 語句匯入模組, 它的文法如下所示:<br />#import module1<br />#import module2[<br />#:<br />#import moduleN<br />#<br />#也可以在一行內匯入多個模組, 像這樣<br />#import module1[, module2[,... moduleN]]<br />#但是這樣的代碼可讀性不如多行的匯入語句。 而且在效能上和產生 Python 位元組代碼時這兩種<br />#做法沒有什麼不同。 所以一般情況下, 我們使用第一種格式。</p><p>#核心風格: import 語句的模組順序<br />#我們推薦所有的模組在 Python 模組的開頭部分匯入。 而且最好按照這樣的順序:<br /># Python 標準庫模組<br /># Python 第三方模組<br /># 應用程式自訂模組<br />#然後使用一個空行分割這三類別模組的匯入語句。 這將確保模組使用固定的習慣匯入, 有助於減<br />#少每個模組需要的 import 語句數目。</p><p>#解譯器執行到這條語句, 如果在搜尋路徑中找到了指定的模組, 就會載入它。該過程遵循作用<br />#域原則, 如果在一個模組的頂層匯入, 那麼它的範圍就是全域的; 如果在函數中匯入, 那麼它的<br />#範圍是局部的。<br />#如果模組是被第一次匯入, 它將被載入並執行。</p><p>## 4.2 from-import 語句<br />#可以在模組裡匯入指定的模組屬性。 也就是把指定名稱匯入到當前範圍。 使用from-import 語句可以實現我們的目的, 它的文法是:<br />#from module import name1[, name2[,... nameN]]</p><p>## 4.3 多行匯入<br />#從一個模組匯入許多屬性時,import 行會越來越長, 直到自動換行, 而且需要一個 \ 。<br />#from Tkinter import Tk, Frame, Button, Entry, Canvas, \<br />#Text, LEFT, DISABLED, NORMAL, RIDGE, END</p><p>#或選擇使用多行的 from-import 語句:<br />#from Tkinter import Tk, Frame, Button, Entry, Canvas, Text<br />#from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END<br />#<br />#不提倡使用不再流行的 from Tkinter import * 語句</p><p>## 4.4 擴充的 import 語句(as)<br />#有時候你匯入的模組或是模組屬性名稱已經在你的程式中使用了, 或者你不想使用匯入的名字。<br />#可能是它太長不便輸入什麼的, 總之你不喜歡它。 這已經成為 Python 程式員的一個普遍需求: 使<br />#用自己想要的名字替換模組的原始名稱。一個普遍的解決方案是把模組賦值給一個變數:</p><p>#import longmodulename<br />#short = longmodulename<br />#del longmodulename</p><p>#使用時就可以使用 short.attribute來代替 longmodulename.attribute 。</p><p>#那麼另一種更簡便的方法:使用擴充的 import , 你就可以在匯入的同時指定局部綁定名稱。</p><p>#import Tkinter<br />#from cgi import FieldStorage<br />#可以替換為==》<br />#import Tkinter as tk<br />#from cgi import FieldStorage as form</p><p>## ********** Part 5: 模組匯入的特性 **************</p><p>## 5.1 載入時執行模組<br />#載入模組會導致這個模組被"執行"。 也就是被匯入模組的頂層代碼將直接被執行。 這通常包<br />#括設定全域變數以及類和函數的聲明。 如果有檢查 __name__ 的操作, 那麼它也會被執行。</p><p>#當然, 這樣的執行可能不是我們想要的結果。 你應該把儘可能多的代碼封裝到函數。明確地說,<br />#只把函數和模組定義放入模組的頂層是良好的模組編程習慣。</p><p>## 5.2 匯入(import )和載入(load)<br />#一個模組只被載入一次, 無論它被匯入多少次。 這可以阻止多重匯入時代碼被多次執行。 例<br />#如你的模組匯入了 sys 模組, 而你要匯入的其他 5 個模組也匯入了它, 那麼每次都載入 sys (或<br />#是其他模組)不是明智之舉! 所以, 載入只在第一次匯入時發生。</p><p>## 5.3 匯入到當前名稱空間的名稱<br />#調用 from-import 可以把名字匯入當前的名稱空間裡去, 這意味著你不需要使用屬性/句點<br />#屬性標識來訪問模組的標識符。 例如, 你需要訪問模組 module 中的 var 名字是這樣被匯入的:<br />#from module import var<br />#我們使用單個的 var 就可以訪問它自身。 把 var 匯入到名稱空間後就再沒必要引用模組了。<br />#當然, 你也可以把指定模組的所有名稱匯入到當前名稱空間裡:<br />#from module import *</p><p>#核心風格: 限制使用 "from module import *"<br />#在實踐中, 我們認為 "from module import *" 不是良好的編程風格, 因為它"汙染"當前名稱<br />#空間, 而且很可能覆蓋當前名稱空間中現有的名字; 但如果某個模組有很多要經常訪問的變數或者<br />#模組的名字很長, 這也不失為一個方便的好辦法。<br />#我們只在兩種場合下建議使用這樣的方法, 一個場合是:目標模組中的屬性非常多, 反覆鍵入<br />#模組名很不方便, 例如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模組, 可能還有<br />#socket 模組。另一個場合是在互動解譯器下, 因為這樣可以減少輸入次數。</p><p>## 5.4 被匯入到匯入者範圍的名字<br />#只從模組匯入名字的另一個副作用是那些名字會成為局部名稱空間的一部分。這可能導致覆蓋一個已經存在的具有相同名字的對象。<br />#而且對這些變數的改變隻影響它的局部拷貝而不是所匯入模組的原始名稱空間。 也就是說, 綁定只是局部的而不是整個名稱空間。</p><p>#唯一的解決辦法是使用 import 和完整的標識符名稱(句點屬性標識)。</p><p>#import imptee<br />#imptee.show()<br />#imptee.foo = 123<br />#print('foo from impter:', imptee.foo)<br />#imptee.show()</p><p>## 5.5 關於 __future__<br />#使用 from-import 語句"匯入"新特性, 使用者可以嘗試一下新特性或特性變化, 以便在特性固定下來的時候修改程式。 它的文法是:<br />#from __future__ import new_feature<br />#只 import __future__ 不會有任何變化,所以這是被禁止的。</p><p>## 5.6 警告架構<br />#和 __future__ 指令類似, 有必要去警告使用者不要使用一個即將改變或不支援的操作, 這樣他們會在新功能正式發布前採取必要措施。</p><p>#首先是應用程式(員)介面(Application programmers' interface , API)。 程式員應該有從<br />#Python 程式(通過調用 warnings 模組)或是 C 中(通過 PyErr_Warn() 調用)發布警告的能力。<br />#這個架構的另個部分是一些警告異常類的集合。 Warning 直接從 Exception 繼承, 作為所有<br />#警告的基類: UserWarning , DeprecationWarning , SyntaxWarning , 以及 RuntimeWarning 。</p><p>#另一個組件是警告過濾器, 由於過濾有多種層級和嚴重性, 所以警告的數量和類型應該是可控<br />#制的。 警告過濾器不僅僅收集關於警告的資訊(例如行號, 警告原因等等), 而且還控制是否忽略警<br />#告, 是否顯示——自訂的格式——或者轉換為錯誤(產生一個異常)。<br />#警告會有一個預設的輸出顯示到 sys.stderr , 不過有鉤子可以改變這個行為, 例如,當運行<br />#會引發警告的 Python 指令碼時,可以記錄它的輸出記錄到記錄檔中,而不是直接顯示給終端使用者。<br />#Python 還提供了一個可以操作警告過濾器的 API 。<br />#最後, 命令列也可以控制警告過濾器。 你可以在啟動 Python 解譯器的時候使用 -W 選項。</p><p>## 5.7 從 ZIP 檔案中匯入模組<br />#在 2.3 版中, Python 加入了從 ZIP 歸檔檔案匯入模組的功能。 如果你的搜尋路徑中存在一<br />#個包含 Python 模組(.py, .pyc, or .pyo 檔案)的 .zip 檔案, 匯入時會把 ZIP 檔案當作目錄處<br />#理, 在檔案中搜尋模組。<br />#如果要匯入的一個 ZIP 檔案只包含 .py 檔案, 那麼 Python 不會為其添加對應的 .pyc 檔案,<br />#這意味著如果一個 ZIP 歸檔沒有匹配的 .pyc 檔案時, 匯入速度會相對慢一點。<br />#同時你也可以為 .zip 檔案加入特定的(子)目錄, 例如 /tmp/yolk.zip/lib 只會從 yolk 歸<br />#檔的 lib/ 子目錄下匯入。</p><p>## 5.8 "新的"匯入鉤子<br />#Python 2.3 引入的新匯入鉤子,從而簡化了這個操作。 你只需要編寫可調用的 import 類, 然<br />#後通過 sys 模組"註冊"(或者叫"安裝")它。<br />#你需要兩個類: 一個尋找器和一個載入器。 這些類的執行個體接受一個參數:模組或包的全名稱。<br />#尋找器執行個體負責尋找你的模組, 如果它找到, 那麼它將返回一個載入器對象。尋找器可以接受一個<br />#路徑用以尋找子包(subpackages) 。載入器會把模組載入到記憶體。它負責完成建立一個 Python 模<br />#塊所需要的一切操作, 然後返回模組。<br />#這些執行個體被加入到 sys.path_hooks 。 sys.path_importer_cache 只是用來儲存這些執行個體, 這<br />#樣就只需要訪問 path_hooks 一次。 最後, sys.meta_path 用來儲存一列需要在查詢 sys.path 之<br />#前訪問的執行個體, 這些是為那些已經知道位置而不需要尋找的模組準備的。 meta-path 已經有了指<br />#定模組或包的載入器對象的讀取器。</p><p>## ********** Part 6: 模組內建函數 **************</p><p>## 6.1 __import__()<br />#作為實際上匯入模組的函數, 這意味著 import 語句調用 __import__() 函數完成它的工作。提供這個函數是為了讓有特殊需要的使用者覆蓋它, 實現<br />#自訂的匯入演算法。__import__() 的文法是:<br /># __import__(module_name[, globals[, locals[, fromlist]]])<br />#module_name 變數是要匯入模組的名稱, globals 是包含當前全域符號表的名字的字典,<br />#locals 是包含局部符號表的名字的字典, fromlist 是一個使用 from-import 語句所匯入符號的列表。<br />#globals , locals , 以及 fromlist 參數都是可選的, 預設分別為 globals() , locals() 和[] 。<br />#調用 import sys 語句可以使用下邊的陳述式完成:<br /># sys = __import__('sys')</p><p>## 6.2 globals() 和 locals()<br />#globals() 和 locals() 內建函數分別返回調用者全域和局部名稱空間的字典。 在一個函數內<br />#部, 局部名稱空間代表在函數執行時候定義的所有名字, locals() 函數返回的就是包含這些名字<br />#的字典。 globals() 會返回函數可訪問的全域名字。</p><p>#在全域名稱空間下, globals() 和 locals() 返回相同的字典, 因為這時的局部名稱空間就是全域空間。</p><p>## 6.3 reload()<br />#reload() 內建函數可以重新匯入一個已經匯入的模組。 它的文法如下:<br /># reload(module)<br />#module 是你想要重新匯入的模組。使用 reload() 的時候有一些標準。 首先模組必須是全部<br />#匯入(不是使用 from-import), 而且它必須被成功匯入。另外 reload() 函數的參數必須是模組自<br />#身而不是包含模組名的字串。 也就是說必須類似 reload(sys) 而不是 reload('sys')。<br />#模組中的代碼在匯入時被執行, 但只執行一次. 以後執行 import 語句不會再次執行這些代碼,<br />#只是綁定模組名稱。 而 reload() 函數不同。</p><p>## ********** Part 7: 包 **************<br />#包是一個有層次的檔案目錄結構, 它定義了一個由模組和子包組成的 Python 應用程式執行環境。<br />#與類和模組相同, 包也使用句點屬性標識來訪問他們的元素。 使用標準的 import 和from-import 語句匯入包中的模組。</p><p>## 7.1 目錄結構</p><p>#樣本:<br />#import Phone.Mobile.Analog<br />#Phone.Mobile.Analog.dial()<br />#Phone 是最頂層的包, Voicedta 等是它的子包,Analog 是我們的模組(py 檔案),dial 是模組裡的函數</p><p>#也可使用 from-import 實現不同需求的匯入。<br />#第一種方法是只匯入頂層的子包, 然後使用屬性/點操作符向下引用子包樹:<br />#from Phone import Mobile<br />#Mobile.Analog.dial('555-1212')<br />#<br />#此外, 我們可以還引用更多的子包:<br />#from Phone.Mobile import Analog<br />#Analog.dial('555-1212')<br />#<br />#事實上, 可以一直沿子包的樹狀結構匯入:<br />#from Phone.Mobile.Analog import dial<br />#dial('555-1212')</p><p>#注意:<br />#在包的目錄中有__init__.py 檔案。 這些是初始化模組,from-import 語句匯入子包時需要用到它。 如果沒有用到, 他們可以是空檔案。<br />#程式員經常忘記為它們的包目錄加入 __init__.py 檔案, 所以從 Python 2.5 開始, 這將會導致一個ImportWarning 資訊。</p><p>## 7.2 使用 from-import 匯入包<br />#包同樣支援 from-import all 語句:<br /># from package.module import *<br />#然而, 這樣的語句會匯入哪些檔案取決於作業系統的檔案系統. 所以我們在__init__.py 中加<br />#入 __all__ 變數. 該變數包含執行這樣的語句時應該匯入的模組的名字. 它由一個模組名字串列表組成.。</p><p>## 7.3 絕對匯入<br />#包的使用越來越廣泛, 很多情況下匯入子包會導致和真正的標準庫模組發生(事實上是它們的<br />#名字)衝突。 包模組會把名字相同的標準庫模組隱藏掉, 因為它首先在包內執行相對匯入, 隱藏掉<br />#標準庫模組。<br />#為此, 所有的匯入現在都被認為是絕對的, 也就是說這些名字必須通過 Python 路徑<br />#(sys.path 或是 PYTHONPATH )來訪問。<br />#這個決定的基本原理是子包也可以通過 sys.path 訪問, 例如 import Phone.Mobile.Analog 。<br />#在這個變化之前, 從 Mobile 子包內模組中匯入 Analog 是合理的。作為一個折中方案, Python 允<br />#許通過在模組或包名稱前置句點實現相對匯入。<br />#<br />#從 Python 2.7 開始, 絕對匯入特性將成為預設功能。</p><p>## 7.4 相對匯入<br />#相對匯入特性稍微地改變了 import 文法, 讓程式員告訴匯入者在子包的哪裡尋找某個模組。<br />#因為 import 語句總是絕對匯入的, 所以相對匯入只應用於 from-import 語句。</p><p>#文法的第一部分是一個句點, 指示一個相對的匯入操作。 之後的其他附加句點代表當前 from 起始尋找位置後的一個層級。</p><p>#from Phone.Mobile.Analog import dial<br />#from .Analog import dial</p><p>## ********** Part 8: 模組的其他特性 **************</p><p>## 8.1 自動載入的模組<br />#當 Python 解譯器在標準模式下啟動時, 一些模組會被解譯器自動匯入, 用於系統相關操作。<br />#唯一一個影響你的是 __builtin__ 模組, 它會正常地被載入, 這和 __builtins__ 模組相同。</p><p>#sys.modules 變數包含一個由當前載入(完整且成功匯入)到解譯器的模組組成的字典, 模組名作為鍵, 它們的位置作為值。</p><p>#windows 下:</p><p>#import sys<br />#print(sys.modules.keys())<br />#--><br />#dict_keys(['reprlib', 'heapq', 'sre_compile', '_collections', 'locale', '_sre', 'functools',<br /># '__main__', 'weakref', 'site', 'sysconfig', 'operator', 'io', 'encodings',<br /># 'copyreg', 'msvcrt', 'encodings.gbk', '_heapq', '_weakref', 'abc', 'builtins',<br /># 'linecache', 'errno', 'token', 'sre_constants', 're', 'encodings.latin_1',<br /># 'collections', 'ntpath', 'tokenize', 'nt', '_warnings', 'genericpath', 'stat',<br /># 'zipimport', 'warnings', '_codecs', '_bisect', 'encodings.utf_8', 'sys', 'getpass',<br /># 'codecs', '_thread', '_multibytecodec', 'os.path', '_functools', '_codecs_cn', '_locale',<br /># 'sitecustomize', 'keyword', 'bisect', 'signal', 'traceback', 'encodings.mbcs', '_io',<br /># '_weakrefset', 'itertools', 'encodings.aliases', 'sre_parse', 'os', '_abcoll'])</p><p>## 8.2 阻止屬性匯入<br />#如果你不想讓某個模組屬性被 "from module import *" 匯入 , 那麼你可以給你不想匯入的屬<br />#性名稱加上一個底線( _ )。 不過如果你匯入了整個模組或是你顯式地匯入某個屬性(例如 import<br />#foo._bar ), 這個隱藏資料的方法就不起作用了。</p><p>## 8.3 不區分大小的匯入<br />#在 Unix(區分大小寫)和 Win32(不區分大小寫)下, 一切都很明了, 但那些新的不區分大小寫<br />#的系統不會被加入區分大小寫特性。 PEP 235 指定了這個特性, 嘗試解決這個問題, 並避免那些<br />#其他系統上"hack"式的解決方案。 底線就是為了讓不區分大小寫匯入正常工作, 必須指定一個叫<br />#做 PYTHONCASEOK 的環境變數。 Python 會匯入第一個匹配模組名( 使用不區分大小寫習慣 )。<br />#否則 Python 會執行它的原生區分大小寫模組名稱匹配, 匯入第一個匹配的模組。</p><p>## 8.4 原始碼編碼<br />#從 Python 2.3 開始, Python 的模組檔案開始支援除 7 位 ASCII 之外的其他編碼。 當然<br />#ASCII 是預設的, 你只要在你的 Python 模組頭部加入一個額外的編碼指示說明就可以讓匯入者<br />#使用指定的編碼解析你的模組, 編碼對應的 Unicode 字串。 所以你使用純 ASCII 文字編輯器的<br />#時候不需要擔心了(不需要把你的字串放入 "Unicode 標籤" 裡) 。<br />#一個 UTF-8 編碼的檔案可以這樣指示:<br />##!/usr/bin/env python<br />## -*- coding: UTF-8 -*-<br />#如果你執行或匯入了包含非 ASCII 的 Unicode 字串而沒有在檔案頭部說明, 那麼你會在<br />#Python 2.3 得到一個 DeprecationWarning , 而在 2.5 中這樣做會導致語法錯誤。</p><p>## 8.5 匯入迴圈<br />#假設有A.py 和B.py 兩個模組, 他們直接有相互的調用(即迴圈匯入),那麼在啟動並執行時候就會報錯。<br />#解決方案就是把 import 語句移到函數內部:<br />#<br />#A.py:<br />#def fun1():<br /># import B<br /># B.fun2()<br />

-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware 
Weibo: http://weibo.com/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(滿);   DBA2 群:62697977(滿)   DBA3 群:62697850(滿)   
DBA 超級群:63306533(滿);  DBA4 群: 83829929(滿)  DBA5群: 142216823(滿)  
DBA6 群:158654907(滿)   DBA7 群:69087192(滿)   DBA8 群:172855474
DBA 超級群2:151508914  DBA9群:102954821      聊天 群:40132017(滿)
--加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.