国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 詳解Python中的相對導入和絕對導入

詳解Python中的相對導入和絕對導入

2020-09-16 13:44Huoty''''s Blog Python

絕對導入是指跳過包內,直接搜索 sys.path ,在sys.path的基礎上進行我們的模塊搜索。相對導入是指先包內,再包外,再,,,那么下面這篇文章主要給大家介紹了Python中的相對導入和絕對導入,需要的朋友可以參考借鑒,下面來一起

前言

Python 相對導入與絕對導入,這兩個概念是相對于包內導入而言的。包內導入即是包內的模塊導入包內部的模塊。

Python import 的搜索路徑

  1. 在當前目錄下搜索該模塊
  2. 在環境變量 PYTHONPATH 中指定的路徑列表中依次搜索
  3. 在 Python 安裝路徑的 lib 庫中搜索

Python import 的步驟

python 所有加載的模塊信息都存放在 sys.modules 結構中,當 import 一個模塊時,會按如下步驟來進行

  1. 如果是 import A,檢查 sys.modules 中是否已經有 A,如果有則不加載,如果沒有則為 A 創建 module 對象,并加載 A
  2. 如果是 from A import B,先為 A 創建 module 對象,再解析A,從中尋找B并填充到 A 的 __dict__

相對導入與絕對導入

絕對導入的格式為 import A.Bfrom A import B,相對導入格式為 from . import Bfrom ..A import B,.代表當前模塊,..代表上層模塊,...代表上上層模塊,依次類推。

相對導入可以避免硬編碼帶來的維護問題,例如我們改了某一頂層包的名,那么其子包所有的導入就都不能用了。但是 存在相對導入語句的模塊,不能直接運行,否則會有異常:

?
1
ValueError: Attempted relative import in non-package

這是什么原因呢?我們需要先來了解下導入模塊時的一些規則:

在沒有明確指定包結構的情況下,Python 是根據 __name__ 來決定一個模塊在包中的結構的,如果是 __main__ 則它本身是頂層模塊,沒有包結構,如果是A.B.C 結構,那么頂層模塊是 A。基本上遵循這樣的原則:

  1. 如果是絕對導入,一個模塊只能導入自身的子模塊或和它的頂層模塊同級別的模塊及其子模塊
  2. 如果是相對導入,一個模塊必須有包結構且只能導入它的頂層模塊內部的模塊

如果一個模塊被直接運行,則它自己為頂層模塊,不存在層次結構,所以找不到其他的相對路徑。

Python2.x 缺省為相對路徑導入,Python3.x 缺省為絕對路徑導入。絕對導入可以避免導入子包覆蓋掉標準庫模塊(由于名字相同,發生沖突)。如果在 Python2.x 中要默認使用絕對導入,可以在文件開頭加入如下語句:

?
1
from __future__ import absolute_import

from __future__ import absolute_import

這句 import 并不是指將所有的導入視為絕對導入,而是指禁用 implicit relative import(隱式相對導入), 但并不會禁掉 explicit relative import(顯示相對導入)。

那么到底什么是隱式相對導入,什么又是顯示的相對導入呢?我們來看一個例子,假設有如下包結構:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
thing
├── books
│ ├── adventure.py
│ ├── history.py
│ ├── horror.py
│ ├── __init__.py
│ └── lovestory.py
├── furniture
│ ├── armchair.py
│ ├── bench.py
│ ├── __init__.py
│ ├── screen.py
│ └── stool.py
└── __init__.py

那么如果在 stool 中引用 bench,則有如下幾種方式:

?
1
2
3
import bench     # 此為 implicit relative import
from . import bench   # 此為 explicit relative import
from furniture import bench # 此為 absolute import

隱式相對就是沒有告訴解釋器相對于誰,但默認相對與當前模塊;而顯示相對則明確告訴解釋器相對于誰來導入。以上導入方式的第三種,才是官方推薦的,第一種是官方強烈不推薦的,Python3 中已經被廢棄,這種方式只能用于導入 path 中的模塊。

相對與絕對僅針對包內導入而言

最后再次強調,相對導入與絕對導入僅針對于包內導入而言,要不然本文所討論的內容就沒有意義。所謂的包,就是包含 __init__.py 文件的目錄,該文件在包導入時會被首先執行,該文件可以為空,也可以在其中加入任意合法的 Python 代碼。

相對導入可以避免硬編碼,對于包的維護是友好的。絕對導入可以避免與標準庫命名的沖突,實際上也不推薦自定義模塊與標準庫命令相同。

前面提到含有相對導入的模塊不能被直接運行,實際上含有絕對導入的模塊也不能被直接運行,會出現 ImportError:

?
1
ImportError: No module named XXX

這與絕對導入時是一樣的原因。要運行包中包含絕對導入和相對導入的模塊,可以用 python -m A.B.C 告訴解釋器模塊的層次結構。

有人可能會問:假如有兩個模塊 a.py 和 b.py 放在同一個目錄下,為什么能在 b.py 中 import a 呢?

這是因為這兩個文件所在的目錄不是一個包,那么每一個 python 文件都是一個獨立的、可以直接被其他模塊導入的模塊,就像你導入標準庫一樣,它們不存在相對導入和絕對導入的問題。相對導入與絕對導入僅用于包內部。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用python能有一定的幫助,如果有疑問大家可以留言交流。

原文鏈接:http://kuanghy.github.io/2016/07/21/python-import-relative-and-absolute

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲乱码国产乱码精品精的特点 | 日韩av色| 成人免费在线观看视频 | 国产精品成人在线视频 | 欧美激情高清 | 五月婷婷综合网 | 国产色视频在线观看免费 | 男女爱爱免费视频 | 亚洲第一免费播放区 | 狠狠综合 | 久色视频在线观看 | 欧美一区二区三区男人的天堂 | 日本在线播放 | 一级片在线观看 | 成人在线免费网站 | 91精品国产乱码久久久久久 | 在线一区二区三区四区 | 有码一区 | 欧美全黄 | 黄色在线观看视频网站 | 玖玖精品在线 | 欧美片网站免费 | 青青国产视频 | hh99me在线观看 | 免费a视频在线观看 | 国产高清视频一区二区 | 亚洲午夜精品 | 成人午夜影院 | 久久久久久久国产 | 中文字幕在线一区 | 日韩视频网 | 久久精品一级 | 亚洲精品久久久一区二区三区 | 日韩成人在线网站 | 欧洲黄色 级黄色99片 | 亚洲一级淫片 | 精品国产欧美 | 成人免费视频观看视频 | 亚洲一区二区三区免费观看 | 久久久久久久国产精品 | 亚洲欧美在线观看 |