Python中如何将两个py文件合并为单个模块导入使用?
Python模块合并实现单个utils命名空间的最优方案
方案1:直接导入通用模块所有内容(最简实现)
这是最适配你当前场景的方案,不需要手写任何包装函数,直接在专属工具模块中导入通用工具的所有公共成员即可:
# utils_functionality_1.py 代码 # 直接导入通用工具的所有非私有属性到当前模块命名空间 from src.utils_general import * # 下方正常编写专属工具函数即可 def utils_func1_for_f1(): # 业务逻辑 pass
随后在main_functionality_1.py中直接导入专属工具模块,即可同时访问两类函数:
# main_functionality_1.py 代码 import src.functionality_1.utils_functionality_1 as utils # 可直接调用通用函数和专属函数 utils.general_func() utils.utils_func1_for_f1()
该方案利用Python原生导入机制直接合并命名空间,无冗余代码,后续新增通用函数也不需要修改专属工具模块,维护成本极低。
方案2:增加__all__控制导出范围(规范实现)
如果需要明确控制对外暴露的函数列表,避免导入不必要的私有成员,可以搭配模块级__all__变量使用:
# utils_functionality_1.py 代码 from src.utils_general import * # 引入通用模块的导出列表 from src.utils_general import __all__ as general_utils_all # 专属工具函数 def utils_func1_for_f1(): pass def utils_func2_for_f1(): pass # 合并导出列表 __all__ = [*general_utils_all, "utils_func1_for_f1", "utils_func2_for_f1"]
该方案适合多人协作的大型项目,明确的导出列表能降低使用者的心智负担,也符合Python的模块开发规范。
方案3:动态属性注入(可控性最高)
如果你不想使用import *语法,希望严格过滤导入的属性,可以通过遍历通用模块属性的方式动态注入到当前模块:
# utils_functionality_1.py 代码 import sys from src import utils_general # 遍历通用模块的所有属性,仅导入非私有成员 for attr_name in dir(utils_general): if not attr_name.startswith("_"): setattr(sys.modules[__name__], attr_name, getattr(utils_general, attr_name)) # 编写专属工具函数 def utils_func1_for_f1(): pass
该方案可以灵活控制导入规则,比如你可以指定只导入特定前缀的通用函数,适合有特殊导入规则的场景。
不推荐的实现方式
你之前想到的手写包装函数的方案维护成本极高,新增通用函数、修改通用函数参数都需要同步修改专属模块的包装代码,冗余度高且容易出问题,不建议使用。
内容的提问来源于stack exchange,提问作者IgnacioGaBo
相关产品推荐
相关产品推荐

