You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:45:02