Python跨模块导入传递行为的专业名称及是否为有意设计咨询
Python中跨模块导入的"传递性导入"行为解析
这种导入行为的专业称谓是传递性导入(Transitive Import),而且这完全是Python模块系统的有意设计。
为什么会出现这种现象?
当你在const_b.py中执行import const_a时,Python会加载const_a模块并将其整个命名空间挂载到const_b的命名空间下。换句话说,const_b模块现在不仅包含自己定义的内容(比如THREE),还持有了const_a模块的引用,以及const_a里所有可访问的对象(比如你的ONE常量)。
当test.py导入const_b后,自然就能通过const_b.ONE访问到原本属于const_a的变量——因为const_b的命名空间里已经有这个引用了。
举个对应你场景的代码例子更直观:
const_a.py:
ONE = 1
const_b.py:
import const_a THREE = 3
test.py:
import const_b print(const_b.ONE) # 输出1 print(const_b.THREE) # 输出3
这是有意设计的原因
Python的模块系统设计成支持传递性导入,核心目的是让模块可以作为命名空间的聚合容器。比如很多第三方库会在根目录的__init__.py里导入各个子模块的核心功能,这样用户只需要import my_library,就能直接通过my_library.some_function调用子模块的功能,而不需要逐个导入my_library.submodule1、my_library.submodule2等,大大简化了使用体验。
小提醒
虽然这是合法的设计,但在实际开发中不推荐直接依赖这种隐式的传递导入——它会让代码的依赖关系变得模糊,别人阅读你的代码时,可能会困惑ONE到底是const_b自己定义的,还是从其他模块来的。更清晰的做法是:
- 在
test.py中直接导入const_a来使用ONE; - 或者在
const_b.py中显式导入需要暴露的内容:from const_a import ONE,这样const_b.ONE的来源就一目了然了。
内容的提问来源于stack exchange,提问作者a.m.
相关产品推荐
相关产品推荐

