tft每日頭條

 > 生活

 > python中import函數的用法

python中import函數的用法

生活 更新时间:2024-08-28 13:21:30

Python的import語句,作用是将模塊或包導入當前程序中。

import語句的語法結構定義(文法規則)如下:

import_stmt ::= "import" module ["as" identifier] ("," module ["as" identifier])*

| "from" relative_module "import" identifier ["as" identifier]

("," identifier ["as" identifier])*

| "from" relative_module "import" "(" identifier ["as" identifier]

("," identifier ["as" identifier])* [","] ")"

| "from" relative_module "import" "*"

module ::= (identifier ".")* identifier

relative_module ::= "."* module | "."

看到這個語法結構定義及其使用的符号,個人感覺這是巴克斯範式和正則表達式的結合體。“::=”在巴克斯範式中可讀作“定義為”;一條文法規則從形式上看是由“::=”連接的左右兩個部分,“::=”左側的符号稱作非終結符(計算機基礎學科——編譯原理中的術語),就是在程序代碼中不會出現的符号;“::=”右側的符号串由一個或多個終結符和非終結符組成。編譯器或解釋器(Python是解釋型語言,對程序解釋執行)按照文法規則對程序代碼進行理解并執行(編譯或解釋)。

上述import語句語句的文法定義中,“::=”右側的符号串中,雙引号中的符号串(字符或字符串)是在源代碼中出現的關鍵字;中括号、小括号、以及星号是正則表達式中使用的非符号。

上述語句的文法定義可從命令行獲取,也可從幫助文檔得到。

命令行獲取方式,在命令行依次鍵入如下命令:

python

help()

import

python中import函數的用法(Python的import語句Win10)1

在幫助文檔中,查看的路徑是:“The Python Language Reference”->“Simple statements”->“The import statement”。

python中import函數的用法(Python的import語句Win10)2

為了加深印象,将上述英文部分翻譯為中文。個人感覺理解這些幫助文檔還是需要有一定的理論和實踐基礎的,翻譯過程中有不少困難需要克服。需要對操作系統、編譯原理、數據結構等有一定的了解:用戶要求操作系統執行Python程序,操作系統按Python程序的要求創建Python進程,Python進程(類似于與現實社會中的組織、機構)中有一個至關重要的名為Python解釋器的存在,Python解釋器完成對用戶輸入的命令或程序的解釋執行,使用了一個名為名空間(namespace)的數據結構。

以下為譯文(譯文中動詞的執行者應該是Python解釋器)。水平有限,僅供參考

基本的import語句(沒有from子句)分兩步執行:

1. 查找一個模塊,必要時加載該模塊并進行初始化

2. 在本地名空間的import語句的作用範圍内定義一個或多個名稱。

當語句包含多個子句(用逗号分隔)時,将為每個子句分别執行這兩個步驟,就像這些子句已被分隔為單獨地導入語句一樣。

關于第一步(查找和加載模塊)的更詳細地描述可參見“import系統”(import system),“import系統”還描述了可導入的各種類型的包和模塊,以及可用于定制導入系統的所有挂鈎(hooks)。

請注意,若此步驟失敗,則表示無法定位模塊或者在初始化模塊時發生錯誤(包括執行模塊代碼時發生的錯誤)。

如果成功檢索到被請求的模塊,将通過以下三種方式之一使得該模塊在本地空間中可用:

•如果模塊名稱後接as,則as後的名稱将直接綁定到導入的模塊。

•如果未指定其他名稱,并且要導入的模塊是頂級模塊,則該模塊的名稱将綁定在本地命名空間中,作為被導入模塊的引用。

•如果要導入的模塊不是頂級模塊,則包含該模塊的頂級包的名稱将綁定在本地命名空間中,作為對頂級包的引用。必須使用被導入的模塊的完整限定名訪問該模塊,而不能直接訪問。

對from結構的處理要複雜一些:

1. 查找from子句中指定的模塊,必要時加載并初始化;

2. 對于import子句中指定的每個标識符:

(1)檢查被導入的模塊是否具有與标識符同名的屬性;

(2)若沒有,則嘗試導入具有該名稱的子模塊,然後再次檢查被導入的子模塊的同名屬性;

(3)如果未找到屬性,則産生導入錯誤(ImportError)。

(4)如果找到,則将一個對該值的引用存儲在本地命名空間中;引用名的确定規則是:如果存在as子句,則使用其中的名稱,否則使用屬性名稱。

例子:

import foo # foo imported and bound locally (foo被導入,與本地名foo綁定)

import foo.bar.baz # foo.bar.baz imported, foo bound locally (foo.bar.baz被導入,foo與本地名foo綁定)

import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb (foo.bar.baz被導入,并與fbb綁定)

from foo.bar import baz # foo.bar.baz imported and bound as baz (foo.bar.baz被導入,域名baz綁定)

from foo import attr # foo imported and foo.attr bound as attr (foo被導入,并将foo.attr域名attr綁定)

如果标識符列表被星号(“*”)替換,則模塊中定義的所有公共名稱都将綁定到import語句所在範圍的本地命名空間中。

模塊定義的公共名稱是通過檢查模塊名稱空間中名為__all__的變量來确定的,如果定義了該變量,則它必須是由該模塊定義或導入的名稱組成的字符串序列。__all__中給出的名稱都被視為公共名稱,并且必須存在。如果沒有定義變量__all__,公共名稱集包括在模塊命名空間中找到的所有名稱,這些名稱以下劃線字符開頭('_')。__all__應包含所有的公共API。它旨在避免意外導出不屬于API的項目(例如導入并在模塊中使用的庫模塊)。

僅允許在模塊級别使用通配符形式的導入(from module import *)。試圖在類或函數定義中使用它将引發語法錯誤。

指定要導入的模塊時,不必指定模塊的絕對名稱。當模塊或包包含在另一個包中時,可以在同一個頂層包中進行相對導入,而不必提及包名稱。通過在from之後的指定模塊或包中使用前導點(leading dots ),可以指定向上遍曆當前包層次結構的高度,而無需指定确切的名稱。一個前導點表示被導入的模塊所在的當前包。兩個點表示上一個包級别。三點是上升兩級,等等。

所以,如果你從一個pkg包的模塊中執行“from . import mod”,将會導緻導入“pkg.mod”。如果你在“pkg.subpkg1”中執行“from ..subpkg2 import mod ”将會導緻導入“pkg.subpkg2.mod”。相對導入的規範包含在“Package Relative Imports ”部分。

importlib.import_module(),用于支持動态确定要加載的模塊的應用程序。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved