亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

項目的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,取決于環境變量。這大部分工作正?!,F在,問題是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 關注
  • 262 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號