【发布时间】:2015-09-30 01:16:28
【问题描述】:
我有一个结构如下的 Django 项目:
appname/
models/
__init__.py
a.py
base.py
c.py
... 其中 appname/models/__init__.py 仅包含如下语句:
from appname.models.base import Base
from appname.models.a import A
from appname.models.c import C
... 以及 appname/models/base.py 包含的位置:
import django.db.models
class Base(django.db.models.Model):
...
appname/models/a.py 包含在哪里:
import appname.models as models
class A(models.Base):
....
...对于 appname/models/c.py 等也是如此。
我对我的代码的这种结构非常满意,但它当然不起作用,因为循环导入。
当 appname/__init__.py 运行时,appname/models/a.py 会运行,但该模块导入“appname.models”,它还没有完成执行。经典循环导入。
所以这应该表明我的代码结构很差,需要重新设计以避免循环依赖。
有哪些方法可以做到这一点?
我能想到的一些解决方案以及为什么我不想使用它们:
- 将我所有的模型代码合并到一个文件中:在我看来,在同一个文件中包含 20 多个类比我尝试做的(使用单独的文件)要糟糕得多。
- 将“Base”模型类移动到“appname/models”之外的另一个包中:这意味着我最终会在我的项目中使用包含基类/父类的包,理想情况下,这些类应该被拆分到它们所在的包中子/子类位于。除了避免循环导入之外,为什么我应该在同一个包中而不是在它们自己的包中(子类/子类所在的位置)中包含模型、表单、视图等的基类/父类?
所以我的问题不仅仅是如何避免循环导入,而是以一种与我尝试实施的方式一样干净(如果不是更干净)的方式来做到这一点。
谁有更好的办法?
【问题讨论】:
-
“编码风格”问题是题外话:避免在标题(和问题)中填充此类问题,而只是提出客观问题。
-
我的问题和风格有关,怎么跑题了?
-
他并不是说你的问题是题外话。他编辑了你的标题,这样不仔细阅读的人就不会觉得它离题了。 :-)
-
一个更通用且可能重复的标题如何比我拥有的更好?我们为什么要迎合不仔细阅读的人?
-
仅从编辑的标题来看,我的问题现在更有可能被标记为重复,即使它与似乎并不关心良好风格的所有其他循环导入问题不同。
标签: python python-import circular-dependency