使用python和django,我们正在创建一个运行许多科学模型的框架。Python运行模型,django用于跟踪状态并创建网页输出。在操作模式下,这很好,因为整个平台(数据库、django可执行文件)都可用。然而,对于新模型的离线创建和测试,我的同事们经常处理独立的代码,与环境无关。然后django部分通常是一个负担(环境、需要设置数据库、计算开销)。因此,我们正在寻找一种打开和关闭Django函数的方法
目前,我们有一个通用类iModel,它具有运行框架中任何模型的所有功能,还有一些django调用。子类继承自此类,并包含特定于模型的功能。
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "framework.settings")
import django.some.modules
class iModel(iModel):
def run(self):
some django calls (eg. change status in DB to 'running')
self.prepareInputdata()
self.runModel()
some more calls (eg. change status in DB to 'finished')
def prepareInputData(self):
example of some code that is used by all child models
class CATmodel(iModel):
def runModel(self):
some specific code for CAT-model
class DOGmodel(iModel):
def runModel(self):
some specific code for DOG-model
我想把iModel这个类分成两个类。一个额外的类iClassWithDjango(),它将继承自iModel并添加Django功能。作为类iModel的包装器。
一级
class iModel(Object):
def run(self):
self.prepareInputDate()
self.runModel()
和二级
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "framework.settings")
import django.some.modules
class iModelWithDjango(iModel):
def run(self):
some django calls (eg. change status in DB to 'running')
super(iModelWithDjango,run)
some more calls (eg. change status in DB to 'finished')
根据情况(运行或离线),DOGmodel和CATmodel将分别继承。来自iModelwithDjango()或iModel()。因此,在运行时动态更改parentclass。
事实上,我最大的问题是如何处理django模块的导入。我如何才能防止这种情况在脱机模式下发生(因为没有设置django环境,所以会失败)。我的想法是将iModelWithDjango()放在一个单独的模块文件中(如上所述),但也许有更好的方法可以做到这一点。
也许有了很多混乱的编码,我可以做到这一点,但我希望你们中的一些人能引导我进行一些干净的编码实践。任何建议欢迎
如果我很理解您的问题,您希望有条件地将模块链接(导入)到您的项目。有多种方法可以做到这一点
一种方法是:
if standAlone:
from iModel import IModel
runner = IModel
else:
from iModelWithDjango import IModelWithDjango
runner = IModelWithDjango
runner().run()