【发布时间】:2022-06-22 23:21:27
【问题描述】:
我已经阅读了关于此的其他主题,但它们并没有真正帮助我。
我必须有 2 个 .py 文件,它们都位于 ets.routes 下,分别称为 agreements.py 和 approvals.py。
文件agreements.py从approvals导入几个方法:
from ets.routes.approvals import getPendingApprovals, getIsApprover
它本身还公开了一个实用方法,该方法应该可供approvals 使用,称为authorize_agreement。
如果我愿意,现在在approvals.py
from ets.routes.agreements import authorize_agreement
我得到了错误
ImportError: cannot import name 'getPendingApprovals' from partially initialized module 'ets.routes.approvals' (most likely due to a circular import)
(C:\gitForVS\app\api\ets\routes\approvals.py)
我无法将authorize_agreement 移动到像utils.py 这样的外部文件中,它确实应该在agreements.py 中,因为它使用了大量的数据库和相关的协议级代码,这些代码在那里可用。只是这个函数应该由它的兄弟导入,而它自己导入一些兄弟的函数。为什么会有这样的问题?您是否需要在 Python 中进行单向导入(例如,仅来自 approvals -> agreements)?
【问题讨论】:
-
这个错误通常意味着你有循环导入。
-
事实上,代码示例显示这是一个循环导入。
-
您可以将其设为“有条件”导入。例如,如果您只需要
authorize_agreement在approvals.py模块中的特定函数内,请将导入行放在该函数内。然后在导入包或模块时不会执行导入,而只会在执行函数时执行,避免循环导入。 -
关于您的问题“您是否需要在 Python 中进行单向导入(例如,仅从批准 -> 协议)?”:考虑一下当模块 A 从模块 B 导入时这意味着什么,以及模块 B 从模块 A 中导入。你遇到了先有鸡还是先有蛋的问题。用你的导入画几张图,看看你能不能解决它:你可能会发现你遇到了问题。
-
并非如此,其他语言允许这样做,例如 Java。
标签: python