繁体   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