【发布时间】:2015-04-18 21:16:57
【问题描述】:
我正在尝试减少我项目的 models.py 中的混乱,我决定移除某些模型的“实用程序”方法。
这个想法是创建一堆实用模块,其中包含将由模型类使用的类和函数,但由于没有不使用其他模型的重要代码段,它会导致循环依赖。例如。在models.py:
from myproject import parse_util
class Entry(models.Model):
text = models.TextField()
parser = parse_util.Parser(self)
def get_some_object():
return parser.parse_text()
class SomeModel(models.Model):
name = models.CharField(max_length=32, null=False, unique=True)
在parse_util.py:
from myproject.models import SomeModel
class Parser():
def __init__(self, entry):
self.entry = entry
def parse_text(self):
# parsing self.entry.text
...
some_object = SomeModel.objects.get(name=parsed_value)
return some_object
我可以通过直接在函数中导入SomeModel 来避免它,而不是在模块范围内进行,或者使用get_model('myapp', 'SomeModel')。但是这两个都不好看。
经过一整天的思考,我概括了这个问题:将模块中的一些代码与模块中的另一个代码相结合的正确和 Pythonic 方式(如果有)从该模块中移出是什么?
也就是说,如果有一个带有classA和classB的模块并且有classB的冗长方法,在某种程度上同时使用classA和classB,有什么好的解决方案可以减少通过将模块拆分为多个模型来描述模块,但保留 classA 和 classB 的入口点。
【问题讨论】:
-
请提供一个具体的例子。有几种技术可以分解代码。
-
@Javier,我已经用具体示例更新了帖子
-
如果你有几个小时可以投资,我强烈推荐 Raymond Hettinger 在 2015 Pycon 上的演讲:Beyond PEP 8 和 Super Considered Super。他们应该从根本上改变你处理这个问题的方式。
-
关于你的最后一段:所以
classB使用classA和classB,但classA只使用classA?
标签: python django module organization code-organization