python3 中的循环导入
Circular imports in python3
我有一个包含多个文件的包。每个文件都包含一个 class 并且 class 是相互依赖的。如何在不将所有代码放在一个文件中的情况下避免循环依赖。有没有更好的方法来重构代码或者有没有办法解决循环导入
这是目录结构
.
|-- Complainant.py
|-- Complaint.py
`-- __init__.py
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
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
init.py
from .Complaint import Complaint
from .Complainant import Complainant
__all__ = [
Complaint,
Complainant
]
在具有循环依赖的系统中,为了避免循环导入,通常必须将相互依赖的部分放在同一个模块中。
在您的情况下,只有一小部分 类 Complaint
和 Complainant
是相互依赖的。您可以重构模块,将不相互依赖的部分放入 BaseComplaint.py
和 BaseComplainant.py
中的 类,并使用第三个模块定义子 类 Complaint
和 Complainant
.
目录结构:
.
|-- BaseComplainant.py
|-- BaseComplaint.py
|-- ComplaintComplainant.py
`-- __init__.py
BaseComplaint.py:
class BaseComplaint(BaseDocument):
ALL_STATUS = ["waiting","resolved", "rejected"]
text = TextField()
timestamp = DateTimeField()
status = TextField()
complainant_id = TextField()
department_ids = ListField(TextField())
BaseComplainant.py
class BaseComplainant(BaseDocument):
account_type = TextField()
account_handle = TextField()
complaint_ids = ListField(TextField())
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
init.py
from .ComplaintComplainant import Complaint, Complainant
__all__ = [
Complaint,
Complainant
]
我有一个包含多个文件的包。每个文件都包含一个 class 并且 class 是相互依赖的。如何在不将所有代码放在一个文件中的情况下避免循环依赖。有没有更好的方法来重构代码或者有没有办法解决循环导入
这是目录结构
.
|-- Complainant.py
|-- Complaint.py
`-- __init__.py
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
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
init.py
from .Complaint import Complaint
from .Complainant import Complainant
__all__ = [
Complaint,
Complainant
]
在具有循环依赖的系统中,为了避免循环导入,通常必须将相互依赖的部分放在同一个模块中。
在您的情况下,只有一小部分 类 Complaint
和 Complainant
是相互依赖的。您可以重构模块,将不相互依赖的部分放入 BaseComplaint.py
和 BaseComplainant.py
中的 类,并使用第三个模块定义子 类 Complaint
和 Complainant
.
目录结构:
.
|-- BaseComplainant.py
|-- BaseComplaint.py
|-- ComplaintComplainant.py
`-- __init__.py
BaseComplaint.py:
class BaseComplaint(BaseDocument):
ALL_STATUS = ["waiting","resolved", "rejected"]
text = TextField()
timestamp = DateTimeField()
status = TextField()
complainant_id = TextField()
department_ids = ListField(TextField())
BaseComplainant.py
class BaseComplainant(BaseDocument):
account_type = TextField()
account_handle = TextField()
complaint_ids = ListField(TextField())
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
init.py
from .ComplaintComplainant import Complaint, Complainant
__all__ = [
Complaint,
Complainant
]