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