python3中的循环导入

fre*_*eza 6 circular-dependency package python-3.x

我有一个包含几个文件的包.每个文件都包含一个类,并且这些类是相互依赖的.如何在不将所有代码放在一个文件中的情况下避免循环依赖.有没有更好的方法来重构代码或有没有办法解决循环导入

这是目录结构

.
|-- Complainant.py
|-- Complaint.py
`-- __init__.py
Run Code Online (Sandbox Code Playgroud)

Complaint.py:

from .Complainant import Complainant

class Complaint(BaseDocument):
    ALL_STATUS = ["waiting","resolved", "rejected"]
    text = TextField()
    timestamp = DateTimeField()
    status = TextField()
    complainant_id = TextField()
    department_ids = ListField(TextField())

    def get_complainant(self):
        db = DBManager.db()
        complainant = Complainant.load(db, self.complainant_id)
        return complainant
Run Code Online (Sandbox Code Playgroud)

Complainant.py

from .Complaint import Complaint

class Complainant(BaseDocument):
    account_type = TextField()
    account_handle = TextField()
    complaint_ids = ListField(TextField())

    def get_complaints(self):
        db = DBManager.db()
        complaints = [Complaint.load(db, i) for i in self.complaint_ids]
        return complaints
Run Code Online (Sandbox Code Playgroud)

init .py

from .Complaint import Complaint
from .Complainant import Complainant

__all__ = [
    Complaint,
    Complainant
]
Run Code Online (Sandbox Code Playgroud)

flo*_*ake 5

在具有循环依赖关系的系统中,为避免循环导入,通常必须将相互依赖的零件放在同一模块中。

在你的情况下,只有阶级的一小部分Complaint,并Complainant是相互依存的。您可以重构模块以将非相互依赖的部分放入BaseComplaint.py和中的类中BaseComplainant.py,并使用第三个模块定义子类ComplaintComplainant

目录结构:

.
|-- BaseComplainant.py
|-- BaseComplaint.py
|-- ComplaintComplainant.py
`-- __init__.py
Run Code Online (Sandbox Code Playgroud)

BaseComplaint.py:

class BaseComplaint(BaseDocument):
    ALL_STATUS = ["waiting","resolved", "rejected"]
    text = TextField()
    timestamp = DateTimeField()
    status = TextField()
    complainant_id = TextField()
    department_ids = ListField(TextField())
Run Code Online (Sandbox Code Playgroud)

BaseComplainant.py

class BaseComplainant(BaseDocument):
    account_type = TextField()
    account_handle = TextField()
    complaint_ids = ListField(TextField())
Run Code Online (Sandbox Code Playgroud)

ComplaintComplainant.py(也许您可以找到一个更好的名字)

from .BaseComplaint import BaseComplaint
from .BaseComplainant import BaseComplainant

class Complaint(BaseComplaint):
    def get_complainant(self):
        db = DBManager.db()
        complainant = Complainant.load(db, self.complainant_id)
        return complainant

class Complainant(BaseComplainant):
    def get_complaints(self):
        db = DBManager.db()
        complaints = [Complaint.load(db, i) for i in self.complaint_ids]
        return complaints
Run Code Online (Sandbox Code Playgroud)

初始化

from .ComplaintComplainant import Complaint, Complainant

__all__ = [
    Complaint,
    Complainant
]
Run Code Online (Sandbox Code Playgroud)