欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中的相對導(dǎo)入和絕對導(dǎo)入

 更新時(shí)間:2017年01月06日 11:44:08   作者:Huoty''''s Blog  
絕對導(dǎo)入是指跳過包內(nèi),直接搜索 sys.path ,在sys.path的基礎(chǔ)上進(jìn)行我們的模塊搜索。相對導(dǎo)入是指先包內(nèi),再包外,再,,,那么下面這篇文章主要給大家介紹了Python中的相對導(dǎo)入和絕對導(dǎo)入,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

Python 相對導(dǎo)入與絕對導(dǎo)入,這兩個(gè)概念是相對于包內(nèi)導(dǎo)入而言的。包內(nèi)導(dǎo)入即是包內(nèi)的模塊導(dǎo)入包內(nèi)部的模塊。

Python import 的搜索路徑

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

Python import 的步驟

python 所有加載的模塊信息都存放在 sys.modules 結(jié)構(gòu)中,當(dāng) import 一個(gè)模塊時(shí),會(huì)按如下步驟來進(jìn)行

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

相對導(dǎo)入與絕對導(dǎo)入

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

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

ValueError: Attempted relative import in non-package

這是什么原因呢?我們需要先來了解下導(dǎo)入模塊時(shí)的一些規(guī)則:

在沒有明確指定包結(jié)構(gòu)的情況下,Python 是根據(jù) __name__ 來決定一個(gè)模塊在包中的結(jié)構(gòu)的,如果是 __main__ 則它本身是頂層模塊,沒有包結(jié)構(gòu),如果是A.B.C 結(jié)構(gòu),那么頂層模塊是 A?;旧献裱@樣的原則:

  1. 如果是絕對導(dǎo)入,一個(gè)模塊只能導(dǎo)入自身的子模塊或和它的頂層模塊同級(jí)別的模塊及其子模塊
  2. 如果是相對導(dǎo)入,一個(gè)模塊必須有包結(jié)構(gòu)且只能導(dǎo)入它的頂層模塊內(nèi)部的模塊

如果一個(gè)模塊被直接運(yùn)行,則它自己為頂層模塊,不存在層次結(jié)構(gòu),所以找不到其他的相對路徑。

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

from __future__ import absolute_import

from __future__ import absolute_import

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

那么到底什么是隱式相對導(dǎo)入,什么又是顯示的相對導(dǎo)入呢?我們來看一個(gè)例子,假設(shè)有如下包結(jié)構(gòu):

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,則有如下幾種方式:

import bench     # 此為 implicit relative import
from . import bench   # 此為 explicit relative import
from furniture import bench # 此為 absolute import

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

相對與絕對僅針對包內(nèi)導(dǎo)入而言

最后再次強(qiáng)調(diào),相對導(dǎo)入與絕對導(dǎo)入僅針對于包內(nèi)導(dǎo)入而言,要不然本文所討論的內(nèi)容就沒有意義。所謂的包,就是包含 __init__.py 文件的目錄,該文件在包導(dǎo)入時(shí)會(huì)被首先執(zhí)行,該文件可以為空,也可以在其中加入任意合法的 Python 代碼。

相對導(dǎo)入可以避免硬編碼,對于包的維護(hù)是友好的。絕對導(dǎo)入可以避免與標(biāo)準(zhǔn)庫命名的沖突,實(shí)際上也不推薦自定義模塊與標(biāo)準(zhǔn)庫命令相同。

前面提到含有相對導(dǎo)入的模塊不能被直接運(yùn)行,實(shí)際上含有絕對導(dǎo)入的模塊也不能被直接運(yùn)行,會(huì)出現(xiàn) ImportError:

ImportError: No module named XXX

這與絕對導(dǎo)入時(shí)是一樣的原因。要運(yùn)行包中包含絕對導(dǎo)入和相對導(dǎo)入的模塊,可以用 python -m A.B.C 告訴解釋器模塊的層次結(jié)構(gòu)。

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

這是因?yàn)檫@兩個(gè)文件所在的目錄不是一個(gè)包,那么每一個(gè) python 文件都是一個(gè)獨(dú)立的、可以直接被其他模塊導(dǎo)入的模塊,就像你導(dǎo)入標(biāo)準(zhǔn)庫一樣,它們不存在相對導(dǎo)入和絕對導(dǎo)入的問題。相對導(dǎo)入與絕對導(dǎo)入僅用于包內(nèi)部。

總結(jié)

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

相關(guān)文章

  • VSCode中autopep8無法運(yùn)行問題解決方案(提示Error: Command failed,usage)

    VSCode中autopep8無法運(yùn)行問題解決方案(提示Error: Command failed,usage)

    這篇文章主要介紹了VSCode中autopep8無法運(yùn)行問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python利用多進(jìn)程將大量數(shù)據(jù)放入有限內(nèi)存的教程

    Python利用多進(jìn)程將大量數(shù)據(jù)放入有限內(nèi)存的教程

    這篇文章主要介紹了Python利用多進(jìn)程將大量數(shù)據(jù)放入有限內(nèi)存的教程,使用了multiprocessing和pandas來加速內(nèi)存中的操作,需要的朋友可以參考下
    2015-04-04
  • dataframe 按條件替換某一列中的值方法

    dataframe 按條件替換某一列中的值方法

    今天小編就為大家分享一篇dataframe 按條件替換某一列中的值方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解python OpenCV學(xué)習(xí)筆記之直方圖均衡化

    詳解python OpenCV學(xué)習(xí)筆記之直方圖均衡化

    本篇文章主要介紹了詳解python OpenCV學(xué)習(xí)筆記之直方圖均衡化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解

    Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解

    這篇文章主要介紹了Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解,argparse?是?Python?的一個(gè)標(biāo)準(zhǔn)庫,用于命令行參數(shù)的解析,這意味著我們無需在代碼中手動(dòng)為變量賦值,而是可以直接在命令行中向程序傳遞相應(yīng)的參數(shù),再由變量去讀取這些參數(shù),需要的朋友可以參考下
    2023-08-08
  • Matlab、Python為工具解析數(shù)據(jù)可視化之美

    Matlab、Python為工具解析數(shù)據(jù)可視化之美

    下面介紹一些數(shù)據(jù)可視化的作品(包含部分代碼),主要是地學(xué)領(lǐng)域,可遷移至其他學(xué)科,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • python 抓包保存為pcap文件并解析的實(shí)例

    python 抓包保存為pcap文件并解析的實(shí)例

    今天小編就為大家分享一篇python 抓包保存為pcap文件并解析的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python 根據(jù)excel中顏色區(qū)分讀取的操作

    python 根據(jù)excel中顏色區(qū)分讀取的操作

    這篇文章主要介紹了python 根據(jù)excel中顏色區(qū)分讀取的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 淺析python 字典嵌套

    淺析python 字典嵌套

    這篇文章主要介紹了python 字典嵌套的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • Python編程使用NLTK進(jìn)行自然語言處理詳解

    Python編程使用NLTK進(jìn)行自然語言處理詳解

    這篇文章主要介紹了Python編程使用NLTK進(jìn)行自然語言處理詳解,涉及了nltk和開發(fā)環(huán)境的簡單介紹,以及SentencesSegment,SentencesSegment等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11

最新評論