【问题标题】:Correct way to make python module smaller by delegating通过委托使python模块更小的正确方法
【发布时间】: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 方式(如果有)从该模块中移出是什么?

也就是说,如果有一个带有classAclassB的模块并且有classB的冗长方法,在某种程度上同时使用classAclassB,有什么好的解决方案可以减少通过将模块拆分为多个模型来描述模块,但保留 classAclassB 的入口点。

【问题讨论】:

  • 请提供一个具体的例子。有几种技术可以分解代码。
  • @Javier,我已经用具体示例更新了帖子
  • 如果你有几个小时可以投资,我强烈推荐 Raymond Hettinger 在 2015 Pycon 上的演讲:Beyond PEP 8Super Considered Super。他们应该从根本上改变你处理这个问题的方式。
  • 关于你的最后一段:所以classB使用classAclassB,但classA只使用classA

标签: python django module organization code-organization


【解决方案1】:

所以你有以下硬编码的依赖项:Entry → Parser → 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

现在硬编码的依赖只是:Entry → Parser

【讨论】:

  • 一个好主意!这样我可以将任何必要的模型作为参数传递给实用程序类。
  • 最终我刚刚将整个模型对象传递给解析器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多