簡體   English   中英

如何解決調用某些 I/O 操作的全局變量?

[英]How to work around a global variable that invokes some I/O operation?

假設我有一個模塊data_provider.py ,它保留了一些負責連接到外部 API 的代碼。 為了建立連接,需要從數據庫中檢索 API 令牌。

API_TOKEN = get_token_from_database()

class DataProvider:
    def __init__(self):
        self.api_token = API_TOKEN

def make_query(self):
    '''make some request using self.api_token'''

假設代碼或多或少需要保持這種形狀( API_TOKEN是一個全局變量),從數據庫中檢索API_TOKEN的好模式是什么?

顯然現在它並不理想,因為在沒有打開數據庫的情況下無法導入模塊。 另外,我只想檢索一次,而不是每次創建DataProvider

例如,我應該讓API_TOKEN延遲加載還是將其轉換為 function?

我可能會用一個簡單的 singleton 模式 go

class DataProvider:
    def __init__(self):
        self.__api_token = None

    def get_token(self):
       if self.__api_token is None:
            self.__api_token = .....
       return self.__api_token

您可能希望將get_token(self)改為屬性token 那是口味問題。

如果您的應用程序中有一個DataProvider object,您可以簡單地刪除全局變量並在__init__方法中加載令牌:

class DataProvider:
    def __init__(self):
        self.api_token = get_token_from_database()

另一種可能的延遲加載是將全局令牌初始化為None ,然后在 DataProvider object 的第一次實例化時將其設置為

API_TOKEN = None

class DataProvider:
    def __init__(self):
        global API_TOKEN

        if API_TOKEN is None:
            API_TOKEN = get_token_from_database()
        self.api_token = API_TOKEN

為簡單起見,仍然省略了錯誤處理...

暫無
暫無

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

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