模塊的層次化命名
To help organize modules and provide a hierarchy in naming, Python has a concept of packages. A package can contain other packages and modules while modules cannot contain other modules or packages. From a file system perspective, packages are directories and modules are files.
import 語(yǔ)句
import的兩種形式
- 不帶from。例如:import datetime。注意:datetime是模塊,如果這樣寫(xiě):import datetime.date,就會(huì)報(bào)錯(cuò):ImportError: No module named date。
- 帶from。例如:from datetime import date
import語(yǔ)句的執(zhí)行
分兩步執(zhí)行:
- 查找一個(gè)模塊;如果需要的話(huà),就初始化它
- 在import語(yǔ)句發(fā)生的作用域的本地命名空間中定義一個(gè)或多個(gè)名稱(chēng)
第一種形式會(huì)為import語(yǔ)句(一次可以導(dǎo)入多個(gè)模塊)中要導(dǎo)入的每個(gè)模塊重復(fù)執(zhí)行這兩步。而第二種僅執(zhí)行第1步一次,因?yàn)橐淮沃荒軐?dǎo)入多個(gè)模塊;然后為該模塊下要導(dǎo)入的每一個(gè)組件重復(fù)執(zhí)行第二步。
第一種import語(yǔ)句會(huì)在本地命名空間中將模塊名綁定至模塊對(duì)象。如果使用了as關(guān)鍵字,那么緊跟在as后面的名稱(chēng)就被用作被導(dǎo)入模塊在當(dāng)前命名空間中的本地名稱(chēng)。而第二種帶有from的import語(yǔ)句不會(huì)綁定模塊名稱(chēng),它翻閱跟在import后面的標(biāo)示符列表,在第一步找到的模塊中查找每一個(gè)命名,并在本地命名空間中將這些名稱(chēng)綁定至導(dǎo)入到當(dāng)前命名空間中的對(duì)象。如果第二種形式使用*號(hào)代替了標(biāo)示符列表,那么在被導(dǎo)入模塊中定義的名稱(chēng)就會(huì)被綁定至import語(yǔ)句所在的本地命名空間。
在一個(gè)模塊中,如果定義了all變量,那么其值必須是一系列由該模塊定義的或?qū)氲拿Q(chēng)。在該變量中給定的名稱(chēng)必須是存在的,且是經(jīng)過(guò)慎重考慮要公開(kāi)的。如果未定義,那么公有的名稱(chēng)集則包含在模塊的命名空間中不以下劃線(xiàn)(_)開(kāi)頭的命名。換句話(huà)說(shuō)就是,以下劃線(xiàn)開(kāi)頭的命名就是私有的,非公開(kāi)的。
all應(yīng)當(dāng)包含整個(gè)公有的API,目的是為了避免意外地暴露并非API一部分的元素,例如,在模塊中被導(dǎo)入和使用的庫(kù)模塊。