有没有办法管理 Python 中的大量导入语句?

Is there a way to manage huge many import statements in Python?

我正在开发 Flask-RESTFul API,我的 app.py 文件中有很多导入语句,如下所示。

from flask import Flask
from flask_restful import Api

from apis.ChambAvail import ChambAvail
from apis.ChambAvailBal import ChambAvailBal
from apis.ChambTwInhibit import ChambTwInhibit
from apis.CurrentWip import CurrentWip
from apis.Detail import Detail
from apis.IncomingWip import IncomingWip
from apis.Info import Info
from apis.Manage import Manage
from apis.MfCount import MfCount
from apis.OtherHold import OtherHold
from apis.PqeDue import PqeDue
from apis.QualInhibit import QualInhibit
from apis.ReleaseBef import ReleaseBef
from apis.RfInhibit import RfInhibit
from apis.SketchDetailedLot import SketchDetailedLot
from apis.SketchLotDetail import SketchLotDetail
from apis.SketchMainDetail import SketchMainDetail
from apis.SketchMainRC import SketchMainRC
from apis.SketchDesignInfo import SketchDesignInfo
from apis.SketchOneDetail import SketchOneDetail
from apis.SketchOneLotDetail import SketchOneLotDetail
from apis.SketchOneMain import SketchOneMain
from apis.SketchOneNearestLot import SketchOneNearestLot
from apis.SketchTimeList import SketchTimeList
from apis.SketchWsgList import SketchWsgList
from apis.TakeEquipDetail import TakeEquipDetail
from apis.TakeEquipLotDetail import TakeEquipLotDetail
from apis.TakeEquipMain import TakeEquipMain
from apis.TakeOneDetail import TakeOneDetail
from apis.TakeOneEquipData import TakeOneEquipData
from apis.TakeOneMain import TakeOneMain
from apis.TakeOneRADetail import TakeOneRADetail
from apis.UpdBufInputCapacity import UpdBufInputCapacity
from apis.UpdEohInputCapacity import UpdEohInputCapacity
from dbmanager import datasource
from logmanager.setlogger import logger
from utils import config_reader

env = 'test'
app = Flask(__name__)
api = Api(app)

api.add_resource(SketchMainRC, '/SketchMainrc')
api.add_resource(SketchDesignInfo, '/SketchDesigninfo')
api.add_resource(SketchWsgList, '/Sketchwsglist')
api.add_resource(SketchMainDetail, '/Sketchmaindetail')
api.add_resource(SketchLotDetail, '/Sketchlotdetail')
api.add_resource(SketchOneMain, '/SketchOneMain')
api.add_resource(SketchOneDetail, '/SketchOnedetail')
api.add_resource(SketchOneLotDetail, '/SketchOnelotdetail')
api.add_resource(SketchOneNearestLot, '/SketchOnenearestlot')
api.add_resource(SketchDetailedLot, '/Sketchdetailedlot')
api.add_resource(SketchTimeList, '/Sketchtimelist')
api.add_resource(TakeEquipMain, '/TakeequipMain')
api.add_resource(TakeEquipDetail, '/Takeequipdetail')
api.add_resource(TakeEquipLotDetail, '/Takeequiplotdetail')
api.add_resource(TakeOneMain, '/TakeOneMain')
api.add_resource(TakeOneDetail, '/TakeOnedetail')
api.add_resource(TakeOneRADetail, '/TakeOneradetail')
api.add_resource(TakeOneEquipData, '/TakeOneequipData')
api.add_resource(ChambAvail, '/chambavail')
api.add_resource(ChambAvailBal, '/chambavailbal')
api.add_resource(ChambTwInhibit, '/chambtwinhibit')
api.add_resource(CurrentWip, '/currentwip')
api.add_resource(IncomingWip, '/incomingwip')
api.add_resource(Detail, '/detail')
api.add_resource(Manage, '/manage')
api.add_resource(MfCount, '/mfcount')
api.add_resource(OtherHold, '/otherhold')
api.add_resource(PqeDue, '/pqedue')
api.add_resource(QualInhibit, '/qualinhibit')
api.add_resource(ReleaseBef, '/releasebef')
api.add_resource(RfInhibit, '/rfinhibit')
api.add_resource(Info, '/info')
api.add_resource(InputCapacity, '/inputcapacity')
api.add_resource(InputCapacity, '/inputcapacity')

app.ls_sf_db_env = 'test'
app.ls_config = config_reader.get_config('test')

# Initialise the connection pool
datasource.initial_all_fab_engine(app)

if __name__ == '__main__':
    logger.info('Starting the server')
    app.run(port=5000, debug=True)

下面是我的项目结构。

这些只是我完成的 API 中的一部分,还有 100 多个。我是 Python,特别是 Flask-RESTFul API 开发的新手。每个 API 我都有单独的 类,我认为那样代码看起来更清晰。但是在我的 app.py 文件中,这些导入语句堆积如山。在我的 app.py 文件中,是否有更好的方法来 add/manage 这些导入语句以及 add.resource() 语句?谁能告诉我是否有办法以不同方式导入所有这些语句并使我的 app.py 更干净? 感谢任何帮助。

我会做一些 path-based 魔术。

以下代码片段将列出 apis/ 子目录中的所有 .py 文件,将它们作为模块导入,提取与文件同名的 class,并将其注册到/ClassName 端点。

from importlib import import_module
from pathlib import Path

HERE = Path(__file__).parent

for api_class_file in HERE.glob("apis/*.py"):
    # apis/ChambAvail.py -> ChambAvail
    api_class_name = api_class_file.stem
    if api_class_name.startswith("__"):
        # skip special files such as __init__ and __main__
        continue

    # equivalent to "import apis.ChambAvail"
    api_module = import_module(f"apis.{api_class_name}")
    # equivalent to "apis.ChambAvail.ChambAvail
    api_class = getattr(api_module, api_class_name)
    api.add_resource(api_class, f"/{api_class_name}")