【问题标题】:Best way to initialize variable in a module?在模块中初始化变量的最佳方法?
【发布时间】:2017-09-16 00:50:33
【问题描述】:

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

  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. 任何其他方式

【问题讨论】:

    标签: python initialization global-variables function-attributes


    【解决方案1】:

    您可能希望将调用数据的服务包装到一个类中

    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 变量可供使用。

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

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

    与您的选项相比,与您的选项相比,您可以根据需要(或错误地)多次实例化同一个类,在这种情况下,将为每个实例获取并存储数据。

    【讨论】:

    • 您能解释一下为什么这是一个更好的方法吗?
    • 我认为类中有一个数据集变量更清楚。它是便携式的。当你有几十个或上百个文件时,清晰和分离关注点对你有好处
    • 如果您将此解释添加到您的答案中,我会接受它。
    【解决方案2】:

    我一直发现这样做的方式是你所说的第一条肉食。对于听起来你想做的事情,那将是你最好的肉食。

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2019-07-21
      • 1970-01-01
      • 2018-03-09
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多