最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 中包/模塊的 `import` 操作代碼

 更新時(shí)間:2019年04月22日 09:13:14   作者:Byron_XIE  
這篇文章主要介紹了Python 中包/模塊的 `import` 操作代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下

用實(shí)例來說明 import 的作用吧。

創(chuàng)建以下包結(jié)構(gòu)。一個(gè)文件夾 cookFish/,下面包含兩個(gè)文件, __init__.pycookBook.py

為什么取這幾個(gè)名字呢?假設(shè)我想用 Python 去做和魚相關(guān)的菜,這件事情很復(fù)雜,所以我給它創(chuàng)建了一個(gè)包,名叫cookFish, 既然是包,在它下面必須得創(chuàng)建一個(gè)文件__init__.py。燒魚必備條件之一就是菜譜,所以接著創(chuàng)建了 cookBook.py。這幾個(gè)文件對(duì)我們這次來說就足夠了,所以就沒有再創(chuàng)建其他文件了。

cookFish/
 __init__.py
 cookBook.py

在cookFish/__init__.py中輸入如下代碼:

__version__ = '0.1'
__author__ = 'XIE Byron'
def cookFish_hello():
 print("cookFish_Hello() from cookFish/__init__.py")

cookFish/cookBook.py中輸入如下代碼:

def cookBook_hello():
 print("cookBook_hello() from cookBook.py")

提示:下面的實(shí)例都是在 Python 自帶的命令行解釋器(windows+python 3.7)中運(yùn)行的結(jié)果。如果你在其他環(huán)境下運(yùn)行,比如jupyter notebook,輸出會(huì)有差異。

"import package-name" 都做了什么?

導(dǎo)入包c(diǎn)ookFish。

>>> import cookFish

提示:

如果import時(shí)出現(xiàn)錯(cuò)誤ModuleNotFoundError,如下:

>>> import cookFish
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'cookFish'

建議先將 Python 的當(dāng)前工作目錄設(shè)置為 cookFish 的 父文件夾(就是包含cookFish文件夾的文件夾)。命令如下:

>>> import os
>>> os.chdir(r'path\to\parent\folder\of\cookFish')

用dir操作查看當(dāng)前命名空間和cookFish命名空間下都有哪些內(nèi)容。

>>> dir() # 查看當(dāng)前命名空間下的對(duì)象。注意: cookFish 在當(dāng)前命名空間下。

['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'cookFish', 'os']

>>> dir(cookFish) # 查看 cookFish 命名空間下的對(duì)象。

['__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'cookFish_hello']

其中的的 __author__, __version__, cookFish_hello 是我們定義的,都導(dǎo)入到了 cookFish 的命名空間下。但是cookFish 下的模塊 cookBook.py 沒有被導(dǎo)入。這是因?yàn)橹苯?code> import cookFish 只運(yùn)行cookFish文件夾下的 __init__.py 文件,不會(huì)運(yùn)行其他模塊,所以cookBook沒有被導(dǎo)入。

提示:Python 中的模塊指后綴 .py的文件,也叫腳本。包 指包含 __init__.py 文件的一個(gè)文件夾,一般還會(huì)包含其他模塊。

包/模塊的命名空間

這里講一下我對(duì)概念“在cookFish的命名空間下”的理解。

Python 的 import A 會(huì)把 A 的Python 代碼運(yùn)行一遍,并把運(yùn)行結(jié)果放在一個(gè)叫A的命名空間下。

提示: 如果 A 是包,A 的 Python 代碼就是 文件夾A下的 __init__.py 中的代碼。 如果 A 是模塊,那么就是文件 A.py 中的代碼。

import B會(huì)把 B 的 Python 代碼運(yùn)行一遍,并把運(yùn)行結(jié)果放在一個(gè)叫 B 的命名空間下。假設(shè)A和B中都有一個(gè)叫X的對(duì)象, A 中的X在當(dāng)前命名空間下叫 A.X,B中的X在當(dāng)前命名空間下叫 B.X,兩個(gè)X在當(dāng)前命名空間下不重名。

提示: 這里的對(duì)象 指 Python 中的變量/屬性,函數(shù),類,實(shí)例等等。

比如__version__屬性(或者叫它變量)就在cookFish的命名空間下,我們只能通過 cookFish.__version__ 才能訪問到 __version__,直接輸入 __version__ 訪問不到它,會(huì)報(bào)錯(cuò)。

直接輸入__version__ 運(yùn)行會(huì)報(bào)如下錯(cuò)誤:

>>> __version__
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name '__version__' is not defined

其他導(dǎo)入包/模塊的方式

如果我們想導(dǎo)入 cookFish 下的模塊 cookBook呢?可以用下面的語法:

>>> import cookFish.cookBook

然后在 cookFish 的命名空間下又多了 cookBook。

>>> dir(cookFish)
['__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'cookBook', 'cookFish_hello']

然后就能通過全名cookFish.cookBook訪問cookBook.py中的對(duì)象了,比如:

>>> cookFish.cookBook.cookBook_hello()
cookBook_hello() from cookBook.py

好長的名字啊,能不能短一點(diǎn)???當(dāng)然可以:

>>> import cookFish.cookBook as cb

然后在當(dāng)前命名空間下就多了對(duì)象 cb:

>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'cb', 'cookFish', 'os']

然后就能通過別名cb來訪問cookBook.py中的對(duì)象了,比如:

>>> cb.cookBook_hello()
cookBook_hello() from cookBook.py

那我能不能只導(dǎo)入cookBook_hello()到當(dāng)前命名空間?當(dāng)然可以

>>> from cookFish.cookBook import cookBook_hello

然后 cookBook_hello 就被導(dǎo)入到當(dāng)前命名空間下了:

>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'cb', 'cookBook_hello', 'cookFish', 'os']

然后就能直接訪問 cookBook_hello()了,不用任何前綴:

>>> cookBook_hello()
cookBook_hello() from cookBook.py

“from 包/模塊名 import *” 是導(dǎo)入所有對(duì)象嗎?

那我可以一次性導(dǎo)入 cookFish 下的所有模塊、所有包嗎?可以也不可以。

Python 有一個(gè)條指令

from 包/模塊名 import *

比如from cookFish import *,給我們的第一感覺是,這條指令是遍歷了 cookFish 下的所有文件,找到這個(gè)包下面的所有包和模塊,把他們統(tǒng)統(tǒng)導(dǎo)入到當(dāng)前命名空間。

但不幸的是,這個(gè)操作在windows和Mac系統(tǒng)上不能很好地實(shí)現(xiàn)。因?yàn)樗鼈兊奈募到y(tǒng)不能提供準(zhǔn)確的文件名大小寫信息。在這兩個(gè)平臺(tái)上,Python 不知道應(yīng)該把ECHO.py導(dǎo)入為模塊echo, Echo 還是ECHO,或者其他。(比如windows 95 上面,所有文件名的首字母都會(huì)顯示為大寫)。如果Python 把 ECHO.py導(dǎo)入為 模塊Echo,但實(shí)際Python代碼中有時(shí)按照 echo 使用的,那肯定會(huì)報(bào)錯(cuò)。[1]

Python 支持大小寫,Echo和ECHO是兩個(gè)不一樣的對(duì)象

Python 的唯一的解決辦法是包的作者提供一個(gè)明確的包的索引,告訴 Python 在 Python 代碼中如何命名這個(gè)模塊。import 語句定義下面一個(gè)約定,如果在包的 __init__.py 中定義了一個(gè) __all__ 列表,在 from xxx import * 時(shí),Python 就會(huì)把 __all__ 列表中的對(duì)象導(dǎo)入。

! 注意:

__all__ 只對(duì) from xxx import * 有影響,對(duì)其他 import 操作沒有任何影響

在cookFish/__init__.py中, 我們只把函數(shù) cookFish_hello加入__all__ 中,代碼如下:

__all__ = ['cookFish_hello', ] # added to support `from xxx import *`
__version__ = '0.1'
__author__ = 'XIE Byron'

def cookFish_hello():
  print("cookFish_Hello() from cookFish/__init__.py")

重啟 Python 解釋器,在導(dǎo)入之前,先運(yùn)行 dir()顯示當(dāng)前命名空間的對(duì)象。

>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os']

! 注意:

Python 解釋器為了提高運(yùn)行效率,同一個(gè)模塊只會(huì)導(dǎo)入一次。一個(gè)模塊被導(dǎo)入后,再次運(yùn)行導(dǎo)入命名不會(huì)重新導(dǎo)入。為了顯示from xx import * 的特殊性,所以需要重啟 Python 解釋器(就是關(guān)閉 Python 解釋器,然后重新進(jìn)入)。

然后運(yùn)行如下:

>>> from cookFish import *

然后輸入 dir() 查看 cookFish_Hello()是否被導(dǎo)入到了當(dāng)前命名空間.

>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'cookFish_hello', 'os']

可以看到只有在__all__列表中的 cookFish_hello被導(dǎo)入到當(dāng)前命名空間,其他什么都沒有導(dǎo)入,連cookFish本身也沒有被導(dǎo)入。

所以問題“可以一次性導(dǎo)入 cookFish 下的所有模塊、所有包嗎?“ 的答案是:是否能一次導(dǎo)入,取決于包的作者有沒有把所有子模塊/子包都加入到 __all__列表中。

參考

[1] Built-in Package Support in Python 1.5

版本

[1] version 1.0, released on 2019-04-21

[2] version 1.1, released on 2019-04-21

添加了 Python 命令的輸出。運(yùn)行工具為windows版本Python(3.7)自帶的命令行解釋器。

相關(guān)文章

  • 用sqlalchemy構(gòu)建Django連接池的實(shí)例

    用sqlalchemy構(gòu)建Django連接池的實(shí)例

    今天小編就為大家分享一篇用sqlalchemy構(gòu)建Django連接池的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python導(dǎo)入模塊的3種方式小結(jié)

    Python導(dǎo)入模塊的3種方式小結(jié)

    本文主要介紹了Python導(dǎo)入模塊的3種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python實(shí)現(xiàn)excel公式格式化的示例代碼

    python實(shí)現(xiàn)excel公式格式化的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)excel公式格式化的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • docker-py 用Python調(diào)用Docker接口的方法

    docker-py 用Python調(diào)用Docker接口的方法

    今天小編就為大家分享一篇docker-py 用Python調(diào)用Docker接口的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python cumsum函數(shù)的具體使用

    python cumsum函數(shù)的具體使用

    這篇文章主要介紹了python cumsum函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python讀取Excel表格文件的方法

    python讀取Excel表格文件的方法

    這篇文章主要介紹了python讀取Excel表格文件的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python 操作 MongoDB 講解詳細(xì)

    Python 操作 MongoDB 講解詳細(xì)

    MongoDB是一款開源的、基于分布式的、面向文檔存儲(chǔ)的非關(guān)系型數(shù)據(jù)庫。擁有高性能、高可用,易擴(kuò)展的優(yōu)點(diǎn),并且支持豐富的查詢語言來支持讀寫操作以及更復(fù)雜的查詢等。接下來我們來看一下如何使用Python操作MongoDB數(shù)據(jù)庫
    2021-09-09
  • Python加密word文檔詳解

    Python加密word文檔詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)對(duì)word文檔添加密碼去除密碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Python爬蟲爬取有道實(shí)現(xiàn)翻譯功能

    Python爬蟲爬取有道實(shí)現(xiàn)翻譯功能

    這篇文章主要介紹了Python爬蟲爬取有道實(shí)現(xiàn)翻譯功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python基于yaml文件配置logging日志過程解析

    Python基于yaml文件配置logging日志過程解析

    這篇文章主要介紹了Python基于yaml文件配置logging日志過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論

铜鼓县| 上林县| 建湖县| 茂名市| 桓仁| 扶沟县| 收藏| 灌南县| 万源市| 修水县| 衡阳市| 华坪县| 玛沁县| 秀山| 海伦市| 天祝| 丹阳市| 车致| 峨眉山市| 元江| 四子王旗| 江源县| 杂多县| 汕头市| 陆川县| 徐闻县| 安平县| 河津市| 山西省| 莱西市| 临江市| 来宾市| 邓州市| 栖霞市| 龙陵县| 乐山市| 吉安市| 台江县| 六盘水市| 鹤峰县| 六安市|