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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注的罗哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值