Python: 允许函数跨调用访问信息的最佳结构是什么

Python: What is the best structure that allows functions to access information across calls

我目前正在编写一个代理功能,旨在在竞争中竞争,并且每轮都会被调用以执行一系列动作。我想在回合之间保存一些数据(函数调用)。

我的问题是什么是存储此数据的最佳方式,以便我的函数可以在调用之间访问它,而不必在每次调用时都重新计算它。我正在考虑制作一个全局 class 对象来存储我需要的所有内容,但怀疑可能还有其他方法。

举个例子,假设我想在该函数中存储一个需要花费一些时间计算的长列表,我可以在哪里 put/store 该列表,以便下一次我可以再次访问它调用函数的时间,无需重新计算。

您似乎走对了路。为什么不创建一个对象 class,创建它的实例来存储不同的 'save data',看看效果如何?

class saveFile:
    def __init__(self, data):
        self.data = data

def main():
    data = something.compute() #whatever that took a bit of time to compute...
    #create an instance of a saveFile class object
    file_1 = saveFile(data)
    #to recall the data in the form of file_1.data
    print(file_1.data)

如果我理解正确的话,有两个简单的解决方案。您可以使用闭包——一个内部函数——这样您就可以对数据进行预处理,return 一个可以在其范围内访问它的函数。

这里有一个相当愚蠢的累加和示例,您可以在创建闭包时对其进行初始化:

def make_acc_sum(init_elements):
    # initial preprocessing
    s = sum(init_elements)

    # function that knows the preprocessed data
    def acc_sum(new_val):
        nonlocal s
        s += new_val
        return s

    return acc_sum


ac = make_acc_sum([1, 2, 3])
for i in range(5):
    print(ac(i))

当您不想对封闭范围内的数据做太多操作时,这在许多应用程序中都是一项很好的技术。如果你只是想在调用函数时访问它,仅此而已,它可以满足你的需求。

如果您希望您的“函数”支持对您的预处理数据进行更一般的操作,您可以将它变成一个对象。来自实现 __call__ 的 class 的对象可以像函数一样被调用:

class acc_sum:
    def __init__(self, init_elements):
        # initial preprocessing
        self.s = sum(init_elements)

    def __call__(self, new_val):
        # function that knows the preprocessed data
        self.s += new_val
        return self.s


ac = acc_sum([1, 2, 3])
for i in range(5):
    print(ac(i))

但是这个版本的 ac 仍然是一个可以拥有属性和额外方法的对象,所以你可以用它做比普通闭包更多的事情(即使这个例子没有利用它)。