亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python中import學習備忘筆記

 更新時間:2017年01月24日 10:13:29   作者:littlewhite  
python中的import語句是用來導入模塊的,在python模塊庫中有著大量的模塊可供使用,要想使用這些文件需要用import語句把指定模塊導入到當前程序中。下面這篇文章主要給大家介紹了python中import學習的相關資料,需要的朋友可以參考借鑒。

前言

在python的模塊有兩種組織方式,一種是單純的python文件,文件名就是模塊名,一種是包,包是一個包含了若干python文件的目錄,目錄下必須有一個文件__init__.py,這樣目錄名字就是模塊名,包里的python文件也可以通過包名.文件名的方式import

import語法

import語法有兩種

1、直接import模塊

 import Module
 import Module as xx

2、從模塊import對象(下級模塊,類,函數,變量等)

 from Module import Name
 from Module immport Name as yy

as語法是用來設置對象(這里用對象泛指模塊,類,函數等等)別名,import將對象名字引入了當前文件的名字空間

假設有如下目錄結構

├── A.py
└── pkg
 ├── B.py
 └── __init__.py

在當前目錄下,以下語句都是有效的

import A 
import pkg
import pkg.B
from pkg import B

為了簡化討論,下面將不會對as語法進行舉例

import步驟

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

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

嵌套import

在import模塊時我們可能會擔心一個模塊會不會被import多次,假設有A,B,C三個模塊,A需要import B和C,B又要import C,這樣A會執(zhí)行到兩次import C,一次是自己本身import,一次是在import B時執(zhí)行的import,但根據上面講到的import步驟,在第二次import時發(fā)現模塊已經被加載,所以不會重復import

但如下情況卻會報錯

#filename: A.py
from B import BB
class AA:pass

#filename: B.py
from A import AA
class BB:pass

這時不管是執(zhí)行A.py還是B.py都會拋出ImportError的異常,假設我們執(zhí)行的是A.py,究其原因如下

  1. 文件A.py執(zhí)行from B import BB,會先掃描B.py,同時在A的名字空間中為B創(chuàng)建module對象,試圖從B中查找BB
  2. 掃描B.py第一行執(zhí)行from A import AA,此時又會去掃描A.py
  3. 掃描A.py第一行執(zhí)行from B import BB,由于步驟1已經為B創(chuàng)建module對象,所以會直接從B的module對象的__dict__中獲取BB,此時顯然BB是獲取不到的,于是拋出異常

解決這種情況有兩種辦法,

  1. 將from B import BB改為import B,或將from A import AA改為import A
  2. 將A.py或B.py中的兩行代碼交換位置

總之,import需要注意的是,盡量在需要用到時再import

包的import

當一個目錄下有__init__.py文件時,該目錄就是一個python的包

import包和import單個文件是一樣的,我們可以這樣類比:

  • import單個文件時,文件里的類,函數,變量都可以作為import的對象
  • import包時,包里的子包,文件,以及__init__.py里的類,函數,變量都可以作為import的對象

假設有如下目錄結構

pkg
├── __init__.py
└── file.py

其中__init__.py內容如下

argument = 0
class A:pass

在和pkg同級目錄下執(zhí)行如下語句都是OK的

>>> import pkg
>>> import pkg.file
>>> from pkg import file
>>> from pkg import A
>>> from pkg import argument

但如下語句是錯誤的

>>> import pkg.A
>>> import pkg.argument

報錯ImportError: No module named xxx,因為當我們執(zhí)行import A.B,A和B都必須是模塊(文件或包)

相對導入和絕對導入

絕對導入的格式為import A.Bfrom A import B,相對導入格式為from . import Bfrom ..A import B,.代表當前模塊,..代表上層模塊,...代表上上層模塊,依次類推。當我們有多個包時,就可能有需求從一個包import另一個包的內容,這就會產生絕對導入,而這也往往是最容易發(fā)生錯誤的時候,還是以具體例子來說明

目錄結構如下

app
├── __inti__.py
├── mod1
│ ├── file1.py
│ └── __init__.py
├── mod2
│ ├── file2.py
│ └── __init__.py
└── start.py

其中app/start.py內容為import mod1.file1

app/mod1/file1.py內容為from ..mod2 import file2

為了便于分析,我們在所有py文件(包括__init__.py)第一行加入print __file__, __name__

現在app/mod1/file1.py里用到了相對導入,我們在app/mod1下執(zhí)行python file1.py或者在app下執(zhí)行python mod1/file1.py都會報錯ValueError: Attempted relative import in non-package

在app下執(zhí)行python -m mod1.file1python start.py都會報錯ValueError: Attempted relative import beyond toplevel package

具體原因后面再說,我們先來看一下導入模塊時的一些規(guī)則

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

基本上遵循這樣的原則

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

有目錄結構如下

A
├── B1
│ ├── C1
│ │ └── file.py
│ └── C2
└── B2

其中A,B1,B2,C1,C2都為包,這里為了展示簡單沒有列出__init__.py文件,當file.py的包結構為A.B1.C1.file(注意,是根據__name__來的,而不是磁盤的目錄結構,在不同目錄下執(zhí)行file.py時對應的包目錄結構都是不一樣的)時,在file.py中可采用如下的絕對的導入

import A.B1.C2
import A.B2

和如下的相對導入

from .. import C2
from ... import B2

什么情況下會讓file.py的包結構為A.B1.C1.file呢,有如下兩種

  1. 在A的上層目錄執(zhí)行python -m A.B1.C1.file, 此時明確指定了包結構
  2. 在A的上層目錄建立文件start.py,在start.py里有import A.B1.C1.file,然后執(zhí)行python start.py,此時包結構是根據file.py__name__變量來的

再看前面出錯的兩種情況,第一種執(zhí)行python file1.pypython mod1/file1.py,此時file.py__name____main__ ,也就是說它本身就是頂層模塊,并沒有包結構,所以會報錯

第二種情況,在執(zhí)行python -m mod1.file1python start.py時,前者明確告訴解釋器mod1是頂層模塊,后者需要導入file1,而file1.py__name__mod1.file1,頂層模塊為也mod1,所以在file1.py中執(zhí)行from ..mod2 import file2時會報錯 ,因為mod2并不在頂層模塊mod1內部。通過錯誤堆??梢钥闯?,并不是在start.py中絕對導入時報錯,而是在file1.py中相對導入報的錯

那么如何才能偶正確執(zhí)行呢,有兩種方法,一種是在app上層目錄執(zhí)行python -m app.mod1.file1,另一種是改變目錄結構,將所有包放在一個大包中,如下

app
├── pkg
│ ├── __init__.py
│ ├── mod1
│ │ ├── __init__.py
│ │ └── file1.py
│ └── mod2
│ ├── __init__.py
│ └── file2.py
└── start.py

start.py內容改成import pkg.mod1.file1,然后在app下執(zhí)行python start.py

總結

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

相關文章

  • Python 如何引入同級包和模塊

    Python 如何引入同級包和模塊

    這篇文章主要介紹了Python 如何引入同級包和模塊,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Python Numpy之linspace用法說明

    Python Numpy之linspace用法說明

    這篇文章主要介紹了Python Numpy之linspace用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python3多線程基礎知識點

    Python3多線程基礎知識點

    在本篇內容里小編給大家分享了關于Python3多線程基礎知識點內容,需要的朋友們跟著學習參考下。
    2019-02-02
  • 在?Python?中創(chuàng)建DataFrame的方法

    在?Python?中創(chuàng)建DataFrame的方法

    這篇文章主要介紹了教你如何在?Python?中創(chuàng)建DataFrame,我們將學習以多種方式創(chuàng)建DataFrame,DataFrame是數據的二維集合,是一種數據結構,其中數據以表格形式存儲,更多相關資料需要的小伙伴可以參考一下
    2022-03-03
  • Python如何導出導入所有依賴包詳解

    Python如何導出導入所有依賴包詳解

    在Python中我們在項目中會用到各種庫,自帶的自然不必再說,這篇文章主要給大家介紹了關于Python如何導出導入所有依賴包的相關資料,需要的朋友可以參考下
    2021-06-06
  • Python人工智能學習PyTorch實現WGAN示例詳解

    Python人工智能學習PyTorch實現WGAN示例詳解

    這篇文章主要為大家介紹了人工智能學習PyTorch實現WGAN的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Python正則表達式急速入門(小結)

    Python正則表達式急速入門(小結)

    這篇文章主要介紹了Python正則表達式急速入門(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Python爬蟲實戰(zhàn)演練之采集糗事百科段子數據

    Python爬蟲實戰(zhàn)演練之采集糗事百科段子數據

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python采集糗事百科段子的數據,大家可以在過程中查缺補漏,提升水平
    2021-10-10
  • 什么是python類屬性

    什么是python類屬性

    在本篇文章里小編給大家分享了關于python類屬性的相關知識點,需要的朋友們可以參考學習下。
    2020-06-06
  • Python作用域用法實例詳解

    Python作用域用法實例詳解

    這篇文章主要介紹了Python作用域用法,結合實例形式詳細分析了Python作用域概念,用法與相關函數的使用技巧,需要的朋友可以參考下
    2016-03-03

最新評論