从前有座山,山上有座庙,庙里有个老和尚说:使用 Python 包(package) 组织代码 题解
预备知识
- Python 中的包即指含有
__init__.py
的目录。包被其他模块导入的时候,会先执行目录下__init__.py
里的代码。 - 包可以嵌套,即包中包中包(套娃了)…
- 使用
import
导入过的包,会缓存于sys.modules
中,再次导入的时候不会重新执行导入动作。反之,如果将其从sys.modules
里删除,再次import
时会触发导入动作。
题目
-
parent/__init__.py
里的代码为print('从前有座山,')
-
parent/one/__init__.py
里的代码为print('山上有座庙,')
-
parent/one/one/__init__.py
里的代码为print('庙里有个老和尚,')
-
parent/two/__init__.py
里的代码为print('老和尚说:')
-
parent/three/__init__.py
里的代码为print('从前有座山,')
# 目录结构如下 python_package_dir_example = ''' parent/ __init__.py one/ __init__.py one/ __init__.py two/ __init__.py three/ __init__.py '''
题目要求
-
通过
import
语句导入模块,触发每个包目录下__init__.py
加载时执行print
语句,从而循环打印出:从前有座山, 山上有座庙, 庙里有个老和尚, 老和尚说: 从前有座山, 山上有座庙, 庙里有个老和尚, 老和尚说: 从前有座山, ...
答案分析
-
随便找的一个答案,其他的同样的分析套路
import sys if __name__ == '__main__': while True: # 缓存为空,依次导入 parent, parent.one, parent.one.one,打印出 # 从前有座山, # 山上有座庙, # 庙里有个老和尚, # 缓存为 parent, parent.one, parent.one.one, import parent.one.one # 从缓存中删除 parent.one.one,缓存为 parent, parent.one, del sys.modules['parent.one.one'] # 缓存为 parent, parent.one, 依次导入 parent, parent.one, 不会打印任何东西 import parent.one # 从缓存中删除 parent.one,缓存为 parent del sys.modules['parent.one'] # 缓存为 parent,依次导入 parent, parent.two, 打印出 # 老和尚说: # 缓存为 parent, parent.two import parent.two # 从缓存中删除 parent.two,缓存为 parent del sys.modules['parent.two'] # 缓存为 parent,导入 parent, 不会打印任何东西 import parent # 从缓存中删除 parent,缓存为空啦 del sys.modules['parent']