VSCode格式化调整import顺序导致Flask的__init__.py出现循环导入如何解决
解决方案
方案1:给后置导入语句添加格式化忽略标记
常用Python格式化工具均支持单行/区域跳过规则,你只需给需要保留后置位置的导入行添加对应标记即可:
- 若使用
isort:在导入行末尾添加# isort:skip - 若使用
black:在导入行末尾添加# fmt: skip - 若使用VSCode默认的autopep8:在导入行末尾添加
# noqa
修改后的代码示例如下:
from flask import Flask app = Flask(__name__) from .config import Config app.config.from_object(Config) from app import routes # isort:skip fmt:skip noqa
添加标记后所有格式化工具都会跳过调整这一行的位置,不会打乱导入顺序触发循环导入。
方案2:配置格式化工具的全局排序规则
你可以在项目根目录添加格式化工具的配置文件,把Flask应用初始化后的导入排除在自动排序范围之外,以isort为例,在项目根目录的pyproject.toml中添加如下配置即可:
[tool.isort] known_first_party = ["app"] force_sort_within_sections = true sections = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER", "APPLICATION"]
方案3:改用应用工厂模式从根源避免循环导入
这是长期最优解,直接调整为Flask官方推荐的应用工厂结构,完全规避循环导入风险,同时所有导入语句都符合PEP8规范,格式化工具怎么调整都不会出错,代码结构示例:
# __init__.py from flask import Flask from .config import Config def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) # 应用实例初始化完成后再导入路由 from app.routes import bp as routes_bp app.register_blueprint(routes_bp) return app
内容的提问来源于stack exchange,提问作者Ciastelix
相关产品推荐
相关产品推荐

