Python导入包时获取模块而非预期函数的问题排查
问题原因与解决
核心问题出在你的子模块名name.py和要导入的函数名name完全同名,结合Python模块加载的命名空间特性,引发了命名冲突。
- 你在
package/__init__.py里执行from .name import name时,确实会把name.py中的name函数导入到package包的命名空间中。但由于子模块本身就叫name,在一些场景下(比如之前缓存过package.name模块、导入顺序影响),Python的模块查找机制会优先将package.name识别为子模块,而非你导入的函数。 - 你提到其他函数用相同方式没问题,大概率是那些函数的子模块名和函数名不重复(比如从
utils.py导入foo函数),不存在命名冲突,所以包命名空间里的对象不会被模块覆盖。
除了你已知的解决方法,还有两种常见处理方式:
- 重命名子模块或函数:把
name.py改成name_utils.py,或者把函数name改成get_name,从根源上避免同名冲突。 - 在__init__.py里使用别名:修改导入语句为
from .name import name as package_name,之后外部代码可以用from package import package_name调用函数,既保留原模块和函数名,又避开冲突。
内容的提问来源于stack exchange,提问作者Runner
相关产品推荐
相关产品推荐

