我从短暂的Python工作当中学到一件事,越是模块化,就越会发现python看似普通的import是大有玄机的。
- python引用python文件时的搜索路径往往都是当前terminal的pwd。(可以在sys还是os模块下append预期的路径)
- python在引用文件是看起来有点像是执行了一遍那个文件。
- python的相对路径真的限制好多,在我看来似乎是在套娃的时候才能用?
所以啊,我不作不明白Python引用机制的人啦!JOJO!
从Python Software Foundation学习到的引用系统(ImportSystem):
当一个import
命令被执行的时候,程序将执行标准库中的__import__()
函数。值得注意的是如果使用importlib.import_module()
可以绕过该函数使用自己的引用机制。
当一个模块被第一次引入的时候,Python会查找该模块,如果找到的话就会创建一个模块对象(module object)。否则raise ModuleNotFoundError
Package
Python中Package的概念是用来管理纷繁的模块的结构化的。一般的理解是Package是一个文件夹,而Module是一个单独的文件。但其实Package只是Module的子类,唯一的区别是Package具有一个Module不具有的变量__path__
从Package中引入子包(subpackage)的时候主包(parent package)的__init__.py
也会被执行(想要拿到小套娃必须打开大套娃的概念)
这是一个例子
parent/
__init__.py
one/
__init__.py
two/
__init__.py
three/
__init__.py
如果我们执行import parent.one
时我们会先执行parent.__init__.py
然后再执行one.__init__.py
.
命名空间包
(啊,看到这个namespace就一个头两个大)
命名空间是对python中对象的索引系统。命名空间包主要解决的是程序目标模块不当前文件系统(以压缩包、网络位置等形式存在)的情况。目前没有遇到过这种应用环境,就先不详细理解了。
模块查找
这块是比较重要的┗|`O′|┛ 嗷~~
这个包已经引入了呦
所有已经引入的包都在sys.modules
储存着从而避免重复导入。
看到目前为止,我的疑惑还没有解答。。。但已经很困了,有缘再来系列?