簡體   English   中英

Python模塊變量的相互依賴性

[英]Python module variable interdependency

我正在嘗試創建一個模塊來保存Fabric文件的配置。 此配置文件將包含與項目相關的設置,因此我可以對所有項目使用相同的fabfile。

我希望fabfile看起來像這樣:

import config
from fabric.api import local

def deploy(env='staging'):
    config.env = env
    local("xcopy {project_dir} {deploy_target} /u /r /y".format(project_dir=config.project_dir, 
                                                                deploy_target=config.deploy_target))
    #Ok, this will be more involved than that, but it is enough to explain my problem

和配置文件如下所示:

env = 'staging'
project_dir = r'c:\some\unimportant\path'
deploy_target = r'c:\some\target\path\based\on\{env}'.format(env=env)

因此,我可以使用: fab deployfab deploy:staging部署到過渡環境,而fab deploy:production部署到生產環境。

我要弄清楚的是,當env變量更改時,如何更新模塊中的變量。

我希望我的配置文件盡可能簡單,理想情況下只是變量分配,但如果確實需要,我可以使用一些功能。 設置文件中會有很多變量,因此使用global關鍵字更新函數中的值看起來非常難看。

將配置參數存儲在字典中。

因此,在具有__init__.py文件的目錄中,有一個名為my_config.py的文件(請注意,該文件必須在您的python_path中),其內容類似於:

my_params = {'env': 'staging',
             'project_dir': r'c:\some\unimportant\path',
             'deploy_target': r'c:\some\target\path\based\on\staging',
            }

我不確定您如何計划將配置設置傳遞到fabfile,但是在配置文件中包含字典之后,訪問設置非常簡單。 如果您具有在單個字典中定義的單個項目的所有配置設置(如上所述),則可以在fabfile中輸入以下內容:

config = __import__('my_config')

此時,您可以通過以下方式訪問配置設置:

env = config.my_params['env']

同樣,我不確定您打算如何傳遞所需的配置,因此,如果我錯過了標記,請發表評論。 無論如何,字典是存儲此類信息的pythonic方法,並且在需要時可以輕松導入這些值。

我認為,每當您更改config.envconfig.env config模塊中的變量得到更新,則需要至少使用一個函數。

最簡單的方法可能是將env作為變量刪除,而是創建setEnv函數(該函數將所有其他模塊變量設置為適當的值)。 另一個選擇是保留env be,但是調用函數以獲取其他值(例如config.get_deploy_target() )。

甚至有可能使模塊看起來僅包含值,而實際上其中的某些或全部是基於env或其他值即時計算的。 這需要使用Python模塊查找系統做一些技巧,以便您實際上是從類實例而不是實際模塊中讀取值。 這使得使用config模塊的代碼很簡單,但是config.py本身更加復雜:

# config.py

class Config(object):
    def __init__(self):
        self.env = "staging"
        self.project_dir = r'c:\some\unimportant\path'

    @property
    def deploy_target(self):
        return r'c:\some\target\path\based\on\{env}'.format(env=self.env)

import sys
sys.modules["config"] = Config()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM