Python 高階2 模組與包

2021-09-22 21:27:23 字數 2202 閱讀 8792

在檔案系統上組織**,並確保每個目錄都定義了乙個__init__.py檔案

from . import png

將檔案合併成乙個單一的邏輯命名空間,後續就可以直接使用from graphics.formats import jpg,png

from module import *會匯入檔案中所有不以下劃線開頭的內容,因此應該避免使用這種形式。

# somemodule.py

def spam():

pass

def grok():

pass

blah = 42

# only export 'spam' and 'grok'

__all__ = ['spam', 'grok']

如果定義了__all__, 那麼只有被列舉出的東西會被匯入,如上例中的【『spam』, 『grok』】函式。

mypackage/

__init__.py

a/__init__.py

spam.py

grok.py

b/__init__.py

bar.py

包匯入分相對路徑匯入和絕對路徑匯入,相對路徑匯入避免了絕對路徑將頂層包名硬編碼到你的原始碼中:

注意:

使用點的這種模式從不是包的目錄中匯入將會引發錯誤

因為主模組的名字總是__main__,python 應用程式的主模組應該總是用絕對匯入,所以在有from . import的檔案中執行會報錯cannot import name '***' from '__main__': ***

絕對路徑匯入:

如果模組mypackage.a.spam要匯入同目錄下的模組grok,from mypackage.a import grok

包中包含**需要讀取的資料檔案。你需要盡可能地用最便捷的方式來做這件事

mypackage/

__init__.py

somedata.dat

spam.py

現在假設spam.py檔案需要讀取somedata.dat檔案中的內容。你可以用以下**來完成,由此產生的變數是包含該檔案的原始內容的位元組字串。

# spam.py

import pkgutil

data = pkgutil.get_data(__package__, 'somedata.dat')

要讀取資料檔案,你可能會傾向於編寫使用內建的i/ o功能的**,如open()。但是這種方法也有一些問題:

import 已存在的.py報錯時,一般因為它所在的目錄不在sys.path裡,新增工作目錄一般有兩種形式:

pythonpath環境變數來新增

import sys

print(sys.path) #檢視路徑是不是在工作目錄中

from os.path import abspath, join, dirname

sys.path.insert(0, join(abspath(dirname(__file__)), 'src'))

使用模組級的變數來精心構造乙個適當的絕對路徑,有時你可以解決硬編碼目錄的問題,比如__file__。

建立乙個.pt**件,將目錄列舉出來,這個.pt**件需要放在某個python的site-packages目錄

/some/dir

/other/dir

參考:

Python 高階 模組 包

命名空間和變數作用域的比較 變數名的查詢覆蓋 匯入模組 模組匯入的特性 模組內建函式 package 包 預設的模組搜尋路徑在 python 解析器編譯安裝時被指定,我們可以通過 sys 模組來檢視和修改它 in 4 sys.path out 4 usr bin usr lib python2.7 ...

高階python 包 和模組

包 簡單而言,包就是資料夾,用來存放檔案。模組 檔案或檔案的集合 python中 和is 的區別 主要 判斷的是兩個變數的值 is 用來判斷兩個變數的記憶體位址 引用傳遞僅僅是資料的引用 is 主要 呼叫的是的是 ip位址 深淺拷貝 1 匯入 copy import copy b copy。copy...

Python經典高階 模組 2

這個模組實現了特定目標的容器,以提供python標準內建容器 dict list set tuple 的替代選擇。類名作用 ordereddict 字典的子類,保留了他們被新增的字典物件的順序 counter 字典的子類,提供了可雜湊物件的計數功能 defaultdict 字典的子類,提供了乙個工廠...