为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

斯蒂芬大帝 2021-12-17 16:47:34
我为不同的环境创建了一个“Django 风格”设置文件。设置文件定义了一些变量,也用作其他模块的依赖注入。所以结构是:settings/    ___init__.py    base.py    dev.py    dev2.py    prod.pyservice/    __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 提供的设置对象。这个问题的解决方案是什么?有一个设置文件作为依赖注入容器来导入模块,并由相同的模块导入?最好是一个简单的解决方案。
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

循环导入的一个非常常见且当然最简单的解决方案是推迟导入,直到您真正需要它们为止。例如,改变


import settings

def func():

    settings.things


def func():

    import settings

    settings.things

如果您绝对必须具有模块全局导入,则可以使用各种技巧,例如


settings = None

def 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()


查看完整回答
反对 回复 2021-12-17
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

代替:


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.dev2

Django 将读取正确的文件。


另外:代替


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


查看完整回答
反对 回复 2021-12-17
  • 2 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信