如何在Python中通过b.py间接调用c.py的foo函数(避免直接引用c.py)
解决方案:通过中间模块暴露依赖成员
Python模块的成员不会自动向上传递暴露,所以a.py仅导入b.py时,无法直接访问b.py所依赖的c.py中的成员。要实现需求,只需在b.py中将c.py的foo函数(或c模块本身)暴露到自身的命名空间即可,以下是具体实现示例:
1. 基础文件结构
三个模块文件处于同一目录下:
c.py:定义目标函数b.py:作为中间模块,负责暴露依赖成员a.py:业务调用模块,仅导入b.py
2. 各模块代码实现
c.py
def foo(): print("执行c.py中的foo函数")
b.py(两种暴露方式可选)
方式一:直接暴露foo函数
将c.py的foo函数直接导入到b.py的命名空间,让a.py可以通过b.foo直接调用:
# 方式一:直接导出foo from c import foo # 可选:如果使用from b import *,需声明__all__控制导出内容 __all__ = ["foo"]
方式二:暴露c模块本身
保留模块层级,让a.py通过b.c.foo调用,适合需要访问c.py多个成员的场景:
# 方式二:暴露c模块 import c # 可选:控制from b import *时的导出内容 __all__ = ["c"]
a.py(对应两种调用方式)
对应方式一的调用
import b # 直接调用b暴露的foo函数 b.foo()
对应方式二的调用
import b # 通过b访问c模块,再调用foo函数 b.c.foo()
注意事项
- 如果使用
from b import *的导入方式,必须在b.py中通过__all__声明允许导出的成员,否则无法导入未声明的内容。 - 这种方式既满足了
a.py仅依赖b.py的抽象需求,也避免了a.py直接与c.py产生耦合。
内容的提问来源于stack exchange,提问作者DotNetRussell
相关产品推荐
相关产品推荐

