Python中模块的最小单位是python文件(*.py)。
这个文件里面可能定义了若干类、变量、函数等等。
在Python程序或命令行中,可以使用import引入整个模块,或这个模块中具体的类、函数等。
用import导入模块既可以到文件层次,也可以到目录层次,当然更细可以导入模块内的类、函数等,但我不认为它们算是模块,python中模块最小的粒度就是文件了。
不同于C语言模块与目录和文件没有必然关系,Python的目录和文件定义了模块的层次关系,例如对于下面的代码结构:
当希望调用patroni/config.py中定义的default_validator()函数时,可以import patroni.config引入模块,然后以patroni.config.default_validator(None)的方式调用, 也可以 from patroni.config import default_validator 引入仅仅default_validator()函数,然后以default_validator(None)的方式调用。
也可以使用别名,例如:
import patroni.config as cf
然后可以这样调用:
cf.default_validator(None)
from patroni.config import default_validator as dv
然后可以这样调用:
dv(None)
目录和文件定义了模块的层次,一个目录可以看做一个更大的模块,目录下需要有一个__init__.py它是这个目录模块的初始化代码,当这个目录被import时,这个文件里的代码被执行,里面可以定义属于这个目录模块的类、函数、变量等,也可以在其中导入其它模块。
例如dcs_modules()定义在dcs/__init__.py中,可以这样调用它:
import patroni.dcs
然后:
patroni.dcs.dcs_modules()
__init__.py 可以再引入其它模块,这样可以通过patroni.dcs前缀引用这些模块,如果__init__.py没有引入其它模块,import patroni.dcs后就只能调用__init__.py中定义的类、函数等了,若要调用patroni/dcs目录下的其它模块,必须进一步引用其模块名,例如import patroni.dcs.etcd。