在模块中初始化变量的最佳方法?

Best way to initialize variable in a module?

假设我需要将传入数据写入云上的数据集中。 何时、何地以及是否需要我的代码中的数据集取决于传入的数据。 我只想获得对数据集的引用一次。 实现此目标的最佳方法是什么?

  1. 启动时初始化为全局变量,通过全局变量访问

    if __name__="__main__":
        dataset = #get dataset from internet
    

这似乎是最简单的方法,但即使从不需要它也会初始化变量。

  1. 第一次需要数据集时获取引用,保存在全局变量中,用get_dataset()方法访问

    dataset = None
    
    def get_dataset():
        global dataset
        if dataset is none
            dataset = #get dataset from internet
        return dataset
    
  2. 第一次需要数据集时获取引用,保存为函数属性,使用get_dataset()方法访问

    def get_dataset():
        if not hasattr(get_dataset, 'dataset'):
            get_dataset.dataset = #get dataset from internet
        return get_dataset.dataset
    
  3. 任何其他方式

我一直找到的方法就是您所说的第一个方法。对于听起来像你想做的事情,那将是你最好的方法。

您可能希望将请求数据的服务包装到 class

class MyService():
  dataset = None

  def get_data(self):
    if self.dataset = None:
      self.dataset = get_my_data()
    return self.dataset

然后你在 main 中实例化它一次,然后在你需要的任何地方使用它。

if __name__="__main__":

  data_service = MyService()
  data = data_service.get_data()
  # or pass the service to whoever needs it
  my_function_that_uses_data(data_service)

这表明有一个 dataset 变量可供使用。

此外,使用对象和 classes 可以在大型项目中更加清晰,因为功能应该从 class 名称和方法中一目了然。

请注意,您也可以轻松地将其设为通用服务,在初始化时将其传递给获取数据的方式(如 url?),因此它可以在不同的端点上重复使用。

与您的选项相比,与之对应的是,您可以根据需要(或错误地)多次实例化相同的 class,在这种情况下,将为每个选项获取和存储数据实例.