为什么 from . import * 不会导入子模块

为什么 from . import * 不会导入子模块

在 Python 中,from . import * 并不会自动导入子模块。这是因为 import * 的行为是由模块的 __all__ 变量决定的。如果没有定义 __all__,它只会导入当前模块中定义的顶层变量和函数,而不会递归地导入子模块。

解决方法

  1. 显式导入子模块
    __init__.py 文件中显式导入你希望包含的子模块。例如:

    from . import test
    print('初始化mytest')
    
  2. 使用 __all__
    如果你仍然希望使用 from . import *,你可以在 __init__.py 文件中定义 __all__ 变量,明确指定要导入的子模块:

    __all__ = ['test']
    print('初始化mytest')
    

    然后在使用 from . import * 时,Python 会根据 __all__ 的定义导入 test 模块。

示例

假设你的文件结构如下:

	/mnt/d/python_proj				
	├── my.py		
		└── mytest
		    ├── __init__.py
		    └── test.py
  • mytest/test.py

    def myfun():
        print("This is myfun in test module")
    
  • mytest/init.py(显式导入子模块):

    from . import test
    print('初始化mytest')
    

    或者使用 __all__

    __all__ = ['test']
    print('初始化mytest')
    
  • my.py

    import mytest
    mytest.test.myfun()
    

通过这种方式,你可以确保 test 模块被正确导入,并且可以在 my.py 中使用 mytest.test.myfun()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

QH_ShareHub

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

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

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

打赏作者

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

抵扣说明:

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

余额充值