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

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自己定义的,还是从其他模块来的。更清晰的做法是:

  1. 在test.py中直接导入const_a来使用ONE;
  2. 或者在const_b.py中显式导入需要暴露的内容:from const_a import ONE,这样const_b.ONE的来源就一目了然了。

内容的提问来源于stack exchange,提问作者a.m.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:43:16