Python中子包与父包同名时如何正确导入以直接访问内部函数
问题原因
当你执行import some_package时,Python实际导入的是根目录下的./some_package/文件夹对应的包,默认只会加载该包下的__init__.py文件中声明的内容。你没有在这个__init__.py中主动导出子模块some_package.py里的函数,所以直接访问some_package.函数名就会报属性不存在的错误。而from some_package import some_package是明确从包中导入了同名的子模块,所以可以正常调用子模块下的函数。
同名包结构是否属于不良实践
是的,这种多层同名的结构属于不必要的不良实践,除了增加导入路径的混淆成本、容易写错导入语句外,没有额外收益,绝大多数Python包不会采用这种三层同名的结构。
调整方案
两种可选方案,按需选择:
方案1:仅修改./some_package/__init__.py(不改动现有结构)
在该文件中添加以下导入语句,把子模块的内容导出到包顶层:
from .some_package import * # 如果要显式控制可导出的内容,补充__all__声明 __all__ = ["你要导出的函数名1", "你要导出的函数名2"]
修改完成后,就可以直接用import some_package调用some_package.py里的对应函数了。
方案2:优化包结构(更推荐)
直接去掉多余的同名嵌套,把./some_package/some_package.py里的代码移动到./some_package/__init__.py中,删除多余的some_package.py文件。调整后结构如下:
some_package │ .gitignore │ NEWS.md │ README.md │ requirements.txt │ setup.py │ ├───tests │ test_some_package.py │ __init__.py │ └───some_package __init__.py
这种结构最简洁,直接import some_package就能访问原来的所有函数,也没有多余的命名混淆问题。
内容的提问来源于stack exchange,提问作者eduardokapp
相关产品推荐
相关产品推荐

