如何合并Python中的import语句?实例场景下的优化求助
合并共享前缀路径的Python导入语句
问题背景
当前项目目录结构如下:
-main.py # 导入语句所在文件 -src -eb_environments -performance_reports -reports_procs -sp -all_targets -add_sp_targets_to_db.py -sb -keywords -targets -search_terms -sd -targets
现有导入语句如下:
from src.eb_environments.performance_reports.reports_procs.sp.all_targets import ( add_sp_targets_to_db, ) from src.eb_environments.performance_reports.reports_procs.sp.search_terms import ( add_sp_sts_to_db, ) from src.eb_environments.performance_reports.reports_procs.sb.keywords import ( add_sb_kws_to_db, ) from src.eb_environments.performance_reports.reports_procs.sb.targets import ( add_sb_targets_to_db, ) from src.eb_environments.performance_reports.reports_procs.sb.search_terms import ( add_sb_st_to_db, ) from src.eb_environments.performance_reports.reports_procs.sd.targets import ( add_sd_targets_to_db, )
所有导入均共享src.eb_environments.performance_reports.reports_procs前缀路径,希望合并简化导入语句,曾尝试在reports_procs目录创建__init__.py但未成功,寻求可行方案。
可行解决方案
方案一:根级__init__.py统一导出
在src/eb_environments/performance_reports/reports_procs/__init__.py中,将所有需要导入的方法统一导入到该模块的命名空间:
# reports_procs/__init__.py from .sp.all_targets import add_sp_targets_to_db from .sp.search_terms import add_sp_sts_to_db from .sb.keywords import add_sb_kws_to_db from .sb.targets import add_sb_targets_to_db from .sb.search_terms import add_sb_st_to_db from .sd.targets import add_sd_targets_to_db
之后在main.py中即可一次性导入所有方法:
from src.eb_environments.performance_reports.reports_procs import ( add_sp_targets_to_db, add_sp_sts_to_db, add_sb_kws_to_db, add_sb_targets_to_db, add_sb_st_to_db, add_sd_targets_to_db, )
注意:之前尝试失败大概率是因为__init__.py中用了绝对路径而非相对路径(比如写src.xxx而非.sp.xxx),或者未将方法正确导入到全局命名空间。
方案二:子模块级__init__.py分类导出
如果希望按子模块(sp/sb/sd)分组管理,可以在每个子模块目录下创建__init__.py:
- 在
reports_procs/sp/__init__.py中:
from .all_targets import add_sp_targets_to_db from .search_terms import add_sp_sts_to_db
- 在
reports_procs/sb/__init__.py中:
from .keywords import add_sb_kws_to_db from .targets import add_sb_targets_to_db from .search_terms import add_sb_st_to_db
- 在
reports_procs/sd/__init__.py中:
from .targets import add_sd_targets_to_db
之后main.py的导入语句可按子模块分组简化:
from src.eb_environments.performance_reports.reports_procs.sp import ( add_sp_targets_to_db, add_sp_sts_to_db, ) from src.eb_environments.performance_reports.reports_procs.sb import ( add_sb_kws_to_db, add_sb_targets_to_db, add_sb_st_to_db, ) from src.eb_environments.performance_reports.reports_procs.sd import ( add_sd_targets_to_db, )
方案三:直接分组导入(无需修改__init__.py)
如果不想修改任何__init__.py,可以将同前缀的导入按子模块合并为多行分组(虽然不如前两种简洁,但比原语句短):
# 导入sp相关方法 from src.eb_environments.performance_reports.reports_procs.sp.all_targets import add_sp_targets_to_db from src.eb_environments.performance_reports.reports_procs.sp.search_terms import add_sp_sts_to_db # 导入sb相关方法 from src.eb_environments.performance_reports.reports_procs.sb import ( keywords, targets, search_terms ) # 调用时需用 keywords.add_sb_kws_to_db 形式,适合不频繁调用的场景
内容的提问来源于stack exchange,提问作者ah2Bwise
相关产品推荐
相关产品推荐

