[英]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.