通过委托使 python 模块更小的正确方法

Correct way to make python module smaller by delegating

我正在尝试减少项目 models.py 中的混乱情况,因此我决定移出某些模型的 "utility" 方法。

我们的想法是创建一堆具有 类 和函数的实用模块,这些模块将由模型 类 使用,但由于没有重要的代码片段不使用其他模型,它会导致循环依赖。例如。在 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 方法(如果有的话)是什么?

也就是说,如果有一个带有 classAclassB 的模块并且有 classB 的冗长方法,它们同时使用 classAclassB在某种程度上,是否有任何好的解决方案可以通过将描述的模块分成几个模型来减少所描述的模块,但保持 classAclassB 的入口点就位。

因此您具有以下硬编码依赖项:条目 → 解析器 → SomeModel。

我打破依赖的方法是使 Parser 像这样通用:

class Parser(object):

    def __init__(self, entry, model):
        self.entry = entry
        self.model = model

    def parse_text(self):
        # parsing self.entry.text
        ...
        some_object = self.model.objects.get(name=parsed_value)
        return some_object

现在硬编码的依赖项只是:条目 → 解析器