Python中的絕對匯入和相對匯入


很多時候,當我們建立Python程式碼時,會發現需要訪問另一個Python檔案或包中的程式碼。這時,需要將另一個Python檔案或包匯入到當前程式碼中。實現此目的最直接的方法是在當前Python程式的頂部寫入以下語句。

import package_name or module_name
or
from pacakge_name import module_name/object_name

解析上述語句時,直譯器將執行以下操作。

  • 直譯器將查詢之前已匯入的所有模組的快取中的名稱。此快取模組的名稱在sys.modules中。

  • 如果在上述步驟中未找到,則直譯器將在內建模組列表中搜索它。這些模組是Python標準庫的一部分。

  • 如果在上述步驟2中仍然未找到,則直譯器將在sys.path中定義的目錄列表中搜索包或模組名稱,其中當前目錄是第一個要搜尋的目錄。

  • 如果在上述任何步驟中找到已匯入的模組,則包或模組的名稱將繫結到當前程式的區域性作用域。

  • 如果從未找到包或模組,則會引發ModuleNotFoundError。

關於匯入的一些規則。

匯入語句應在使用這些語句的檔案頂部提及。匯入語句的順序如下所示。

  • Python的標準庫模組

  • 從第三方模組匯入

  • 從本地應用程式匯入

絕對匯入

在這種型別的匯入中,我們指定要匯入的包/模組/函式的完整路徑。點(.)用於代替斜槓(/)表示目錄結構。

考慮包的以下目錄結構。

python_project_name/packageA/moduleA1.py
python_project_name/packageA/moduleA2.py

此外,假設moduleA2有一個名為myfunc的函式。當我們想將該函式匯入到當前Python程式時,使用絕對路徑,我們使用以下匯入語句。

from packageA.moduleA2 import myfunc

絕對匯入的最大優點是它清楚地指明瞭匯入發生的位置,另一方面,有時它可能會變得相當冗長。

相對匯入

在相對匯入中,我們將匯入包的路徑指定為相對於使用匯入模組的當前指令碼的位置。

一個點表示當前位置向上一個目錄,兩個點表示向上兩個目錄,以此類推。

考慮包的以下目錄結構。

python_project_name/packageA/moduleA1.py
python_project_name/packageB/moduleB1.py

假設上述包結構中的moduleB1需要匯入moduleA1。那麼匯入語句是

from ..packageA import moduleA1

兩個點表示從moduleB1的位置,我們必須移動到python_project_name目錄,然後進入packageA獲取moduleA1。

這種匯入比較簡潔,頂級專案可以輕鬆地從一個位置移動到另一個位置,而無需更改匯入語句中的路徑。缺點是,如果共享匯入資料夾,則當路徑發生某些修改時,程式碼很容易受到影響。

更新於:2019年7月30日

532 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.