云計(jì)算開(kāi)發(fā)學(xué)習(xí)筆記:Python3如何從一個(gè)包中導(dǎo)入*

發(fā)布時(shí)間:2024-03-06
設(shè)想一下,如果我們使用 from sound.effects import *會(huì)發(fā)生什么?python 會(huì)進(jìn)入文件系統(tǒng),找到這個(gè)包里面所有的子模塊,一個(gè)一個(gè)的把它們都導(dǎo)入進(jìn)來(lái)。
但是很不幸,這個(gè)方法在 windows平臺(tái)上工作的就不是非常好,因?yàn)閣indows是一個(gè)大小寫不區(qū)分的系統(tǒng)。
在這類平臺(tái)上,沒(méi)有人敢擔(dān)保一個(gè)叫做 echo.py 的文件導(dǎo)入為模塊 echo 還是 echo 甚至 echo。
(例如,windows 95就很討厭的把每一個(gè)文件的首字母大寫顯示)而且 dos 的 8 3 命名規(guī)則對(duì)長(zhǎng)模塊名稱的處理會(huì)把問(wèn)題搞得更糾結(jié)。
為了解決這個(gè)問(wèn)題,只能煩勞包作者提供一個(gè)精確的包的索引了。
導(dǎo)入語(yǔ)句遵循如下規(guī)則:如果包定義文件 __init__.py 存在一個(gè)叫做 __all__ 的列表變量,那么在使用 from package import * 的時(shí)候就把這個(gè)列表中的所有名字作為包內(nèi)容導(dǎo)入。
作為包的作者,可別忘了在更新包之后保證 __all__ 也更新了啊。你說(shuō)我就不這么做,我就不使用導(dǎo)入*這種用法,好吧,沒(méi)問(wèn)題,誰(shuí)讓你是老板呢。這里有一個(gè)例子,在:file:sounds/effects/__init__.py中包含如下代碼:
這表示當(dāng)你使用from sound.effects import *這種用法時(shí),你只會(huì)導(dǎo)入包里面這三個(gè)子模塊。
如果 __all__ 真的沒(méi)有定義,那么使用from sound.effects import *這種語(yǔ)法的時(shí)候,就不會(huì)導(dǎo)入包 sound.effects 里的任何子模塊。他只是把包sound.effects和它里面定義的所有內(nèi)容導(dǎo)入進(jìn)來(lái)(可能運(yùn)行__init__.py里定義的初始化代碼)。
這會(huì)把 __init__.py 里面定義的所有名字導(dǎo)入進(jìn)來(lái)。并且他不會(huì)破壞掉我們?cè)谶@句話之前導(dǎo)入的所有明確指定的模塊??聪逻@部分代碼:
這個(gè)例子中,在執(zhí)行 from…import 前,包 sound.effects 中的 echo 和 surround 模塊都被導(dǎo)入到當(dāng)前的命名空間中了。(當(dāng)然如果定義了 __all__ 就更沒(méi)問(wèn)題了)
通常我們并不主張使用 * 這種方法來(lái)導(dǎo)入模塊,因?yàn)檫@種方法經(jīng)常會(huì)導(dǎo)致代碼的可讀性降低。不過(guò)這樣倒的確是可以省去不少敲鍵的功夫,而且一些模塊都設(shè)計(jì)成了只能通過(guò)特定的方法導(dǎo)入。
記住,使用 from package import specific_submodule 這種方法永遠(yuǎn)不會(huì)有錯(cuò)。事實(shí)上,這也是推薦的方法。除非是你要導(dǎo)入的子模塊有可能和其他包的子模塊重名。
如果在結(jié)構(gòu)中包是一個(gè)子包(比如這個(gè)例子中對(duì)于包sound來(lái)說(shuō)),而你又想導(dǎo)入兄弟包(同級(jí)別的包)你就得使用導(dǎo)入絕對(duì)的路徑來(lái)導(dǎo)入。比如,如果模塊sound.filters.vocoder 要使用包 sound.effects 中的模塊 echo,你就要寫成 from sound.effects import echo。
無(wú)論是隱式的還是顯式的相對(duì)導(dǎo)入都是從當(dāng)前模塊開(kāi)始的。主模塊的名字永遠(yuǎn)是__main__,一個(gè)python應(yīng)用程序的主模塊,應(yīng)當(dāng)總是使用絕對(duì)路徑引用。
包還提供一個(gè)額外的屬性__path__。這是一個(gè)目錄列表,里面每一個(gè)包含的目錄都有為這個(gè)包服務(wù)的__init__.py,你得在其他__init__.py被執(zhí)行前定義哦。可以修改這個(gè)變量,用來(lái)影響包含在包里面的模塊和子包。
這個(gè)功能并不常用,一般用來(lái)擴(kuò)展包里面的模塊。
上一個(gè):預(yù)埋件安裝質(zhì)量不合格原因及治理措施有哪些?
下一個(gè):電水壺開(kāi)關(guān)按鈕怎么修視頻(電水壺開(kāi)關(guān)按鈕怎么修)

xbox鍵鼠支持游戲列表2020(xbox用鍵鼠玩感覺(jué)怎么樣)
怎樣將筆記本當(dāng)顯示器用(怎么把筆記本電腦當(dāng)做顯示器)
360桌面護(hù)眼模式(360護(hù)眼色開(kāi)啟關(guān)閉)
非婚生子女怎么辦理出生醫(yī)學(xué)證明
Linear LDO系列之成員LT3007的H級(jí)版本登場(chǎng)
外貿(mào)網(wǎng)站建設(shè),需要注意哪些細(xì)節(jié)?
2016年3000元電腦主機(jī)配置單(2016年6000元電腦配置)
中國(guó)工程院院士"喝茶防癌大討論"(二):喝茶到底能防哪些癌?
上海迪士尼地球月時(shí)間+活動(dòng)內(nèi)容
21年食品中重金屬快速檢測(cè)儀原理
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos