通过委托使 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 方法(如果有的话)是什么?
也就是说,如果有一个带有 classA
和 classB
的模块并且有 classB
的冗长方法,它们同时使用 classA
和 classB
在某种程度上,是否有任何好的解决方案可以通过将描述的模块分成几个模型来减少所描述的模块,但保持 classA
和 classB
的入口点就位。
因此您具有以下硬编码依赖项:条目 → 解析器 → 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
现在硬编码的依赖项只是:条目 → 解析器
我正在尝试减少项目 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 方法(如果有的话)是什么?
也就是说,如果有一个带有 classA
和 classB
的模块并且有 classB
的冗长方法,它们同时使用 classA
和 classB
在某种程度上,是否有任何好的解决方案可以通过将描述的模块分成几个模型来减少所描述的模块,但保持 classA
和 classB
的入口点就位。
因此您具有以下硬编码依赖项:条目 → 解析器 → 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
现在硬编码的依赖项只是:条目 → 解析器