模块的层次化命名
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 语句
import的两种形式
- 不带from。例如:import datetime。注意:datetime是模块,如果这样写:import datetime.date,就会报错:ImportError: No module named date。
- 带from。例如:from datetime import date
import语句的执行
分两步执行:
- 查找一个模块;如果需要的话,就初始化它
- 在import语句发生的作用域的本地命名空间中定义一个或多个名称
第一种形式会为import语句(一次可以导入多个模块)中要导入的每个模块重复执行这两步。而第二种仅执行第1步一次,因为一次只能导入多个模块;然后为该模块下要导入的每一个组件重复执行第二步。
第一种import语句会在本地命名空间中将模块名绑定至模块对象。如果使用了as关键字,那么紧跟在as后面的名称就被用作被导入模块在当前命名空间中的本地名称。而第二种带有from的import语句不会绑定模块名称,它翻阅跟在import后面的标示符列表,在第一步找到的模块中查找每一个命名,并在本地命名空间中将这些名称绑定至导入到当前命名空间中的对象。如果第二种形式使用*号代替了标示符列表,那么在被导入模块中定义的名称就会被绑定至import语句所在的本地命名空间。
在一个模块中,如果定义了all变量,那么其值必须是一系列由该模块定义的或导入的名称。在该变量中给定的名称必须是存在的,且是经过慎重考虑要公开的。如果未定义,那么公有的名称集则包含在模块的命名空间中不以下划线(_)开头的命名。换句话说就是,以下划线开头的命名就是私有的,非公开的。
all应当包含整个公有的API,目的是为了避免意外地暴露并非API一部分的元素,例如,在模块中被导入和使用的库模块。