项目的python设置 - 循环导入/依赖注入

我为不同的环境创建了一个“Django 风格”设置文件。设置文件定义了一些变量,也用作其他模块的依赖注入。


所以结构是:


settings/

    ___init__.py

    base.py

    dev.py

    dev2.py

    prod.py


service/

    __init__.py

    service.py

    service_mock.py

在settings/__init__.py我写:


settings_env = os.environ.get('PROJECT_SETTINGS', '')

if settings_env == 'prod':

   from .prod import *

elif settings_env == 'dev':

   from .dev import *

每个设置文件定义不同的一些变量,并且还从service.py或导入一个类service_mock.py,取决于环境变量。

这大部分工作正常。


现在,问题是service.py无法导入设置包,因为设置文件导入了service.py,因此将成为循环导入。


正如我在 Django 中看到的,它是通过在设置文件中使用导入字符串而不是实际导入来解决的。我不太喜欢这个想法,因为我失去了一些 IDE 自动完成功能,而且我不确定如何实际创建 Django 提供的设置对象。


这个问题的解决方案是什么?有一个设置文件作为依赖注入容器来导入模块,并由相同的模块导入?最好是一个简单的解决方案。


斯蒂芬大帝
浏览 218回答 2
2回答

千巷猫影

循环导入的一个非常常见且当然最简单的解决方案是推迟导入,直到您真正需要它们为止。例如,改变import settingsdef func():    settings.things到def func():    import settings    settings.things如果您绝对必须具有模块全局导入,则可以使用各种技巧,例如settings = Nonedef import_stuff():    global settings    import settings as s    settings = s或者上课class Settings():    mod = None            def __getattr__(self, attr):        if self.mod is None:            import settings            self.mod = settings        return getattr(self.mod, attr)settings = Settings()

牛魔王的故事

代替:settings_env = os.environ.get('PROJECT_SETTINGS', '')if settings_env == 'prod':   from .prod import *elif settings_env == 'dev':   from .dev import *你可以只导出一个变量:DJANGO_SETTINGS_MODULE your_project.settings.dev2Django 将读取正确的文件。另外:代替import settings你想使用:from django.conf import settings及以上可以嵌套在方法/函数中以避免循环导入。请参阅:https : //docs.djangoproject.com/en/dev/topics/settings/#using-settings-in-python-code请参阅:https : //docs.djangoproject.com/en/dev/topics/settings/#custom-default-settings
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python