从前有座山,山上有座庙,庙里有个老和尚说:使用 Python 包(package) 组织代码 题解

从前有座山,山上有座庙,庙里有个老和尚说:使用 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']
    

你可能感兴趣的:(CSDN,Python,入门技能树,python,开发语言,题解)