2016-10-22 29 views
3

我讀PEP338。有些話讓我感到困惑:模塊在Python中有類型嗎?

如果模塊被找到,並且是PY_SOURCE的PY_COMPILED,然後在命令行中被有效地從python <options> -m <module> <args>python <options> <filename> <args>重新詮釋。

模塊在Python中有類型嗎?

+1

有*類型的模塊*,因爲它們來源於字節編譯的緩存文件或來自源。單詞*類型*與對象的類不同。 –

+1

查看關於python文件擴展名http://stackoverflow.com/a/18032741/6575931 – Uriel

回答

5

模塊可以從不同來源加載。筆者指模塊從裝載2個具體來源,參見imp module documentation

imp.PY_SOURCE
該模塊發現的一個源文件。

[...]

imp.PY_COMPILED
該模塊發現作爲已編譯代碼對象文件。

[...]

imp.C_EXTENSION
該模塊被發現爲可動態加載共享庫。

這些值用於imp.get_suffixes() function等的返回值中。

PEP指出只支持從源文件(.py文件)和字節碼緩存文件(.pyc)加載的模塊; -m交換機不支持C擴展模塊(通常爲.so.dll動態加載的庫)。

生成的模塊對象仍然只是一個模塊對象;在您發現的文本中,類型的文字並不是指Python的類型系統。

1

型模塊的指類型,其中所述模塊被存儲在文件的,因爲蟒文件具有一些可能的類型(和擴展。

最常見的被編譯Python文件(PYC擴展名)或常規,蟒蛇純源(PY

還有許多其他PY文件擴展名,請參見(幾乎)完整列表在這裏:https://stackoverflow.com/a/18032741/6575931

+0

感謝您的幫助,我將閱讀相關鏈接 –

1

從提出的鏈接PEP338

擬議語義 語義引用是相當簡單:如果-m是用於執行模塊用於 的PEP 302 導入機制定位 模塊並檢索其編譯代碼,然後根據頂級模塊的語義執行 模塊。

現在讓我們參考IMP(導入機制)的文件,並確定了不同類型的模塊可以導入 imp.get_suffixes()

imp.get_suffixes()返回列表3元素元組,每個元組描述 特定類型的模塊。每個三元組的形式(後綴,模式, 類型),其中後綴是一個字符串,要附加到模塊名稱 形式的文件名搜索,模式是模式字符串傳遞到 內置開放)函數打開文件(對於 文本文件,這可以是'r'或對於二進制文件'rb'),並且類型是文件類型 ,其具有所描述的值PY_SOURCE,PY_COMPILED或C_EXTENSION, 中的一個下面。

,隨後它解釋了不同類型

imp.PY_SOURCE模塊被發現的一個源文件。

imp.PY_COMPILED該模塊被發現是一個編譯的代碼對象文件。

imp.C_EXTENSION該模塊被發現爲可動態加載共享庫 。

所以,在PEP 338中提到的類型是什麼,但可以導入這些僅PY_SOURCE的或PY_COMPILED是僅有的兩個類型的出上述三個的命令行被有效地從蟒重新解釋類型的模塊-m到python。

+0

感謝您的不錯的幫助,而且您的答案也很棒。 –