gpt4 book ai didi

python - 我可以使用(误用)globals() 命名空间来进行持久存储吗?

转载 作者:行者123 更新时间:2023-12-01 05:51:16 26 4
gpt4 key购买 nike

我正在编写一些实用程序,我想将它们作为函数调用。它们是通过往往不会改变的上下文和一些数据来调用的。需要对上下文进行大量耗时的处理,但是一旦完成,用它来暴露数据就相当轻量了。

这显然可以很好地映射到以下模式

class MyFunc():
def __init__(self, context):
self.foo_d_context=foo(context)
def __call__(self, data):
return bar(self.foo_d_context, data)

if __name__ == '__main__':
my_callable=MyFunc(my_context)

results1=my_callable(my_data1)
results2=my_callable(my_data2)

但是,我的用户反对最初创建 my_callable 对象。他们更容易接受的是一个可以像这样使用的函数

结果=my_func(my_context, my_data)

...并让函数 my_func 查看先前调用的持久数据是否存在,并且与上次调用相同。

问题是第一次调用该函数时,它可以在哪里存储持久数据?似乎 Python 标准库中已有的几个实用程序都说它们是这样工作的,并且文档讨论了设置对象的辅助函数。但我还没弄清楚它是如何工作的。

我可以想到一种方法,但感觉错误且不符合Python标准。看来我可以直接将对象放入 globals() 命名空间中,并在任何函数中执行此操作。所以我可以这样做

def my_func(context,data):
glob=globals()
try:
if glob['__my_persistent_reference_context_$$$'] == context:
return bar(glob['__my_foo_d_context_$$$'],data)
except KeyError:
pass
glob['__my_foo_d_context_$$$']=foo(context)
glob['__my_persistent_reference_context_$$$'] = context
return bar(glob['__my_foo_d_context_$$$'],data)

写完上面的内容后,我突然想到这个函数可以创建 MyFunc 类的对象,这听起来更接近我正在寻找的概念,但它仍然需要给它起个名字,把它放在某个地方,所以这并不能解决基本的“我可以使用全局命名空间吗?”问题。

这样可以吗?

它总是有效吗? (我使用的是 2.6.6,它最终在 3 中还能工作吗?)

有更好的方法吗?

有更好的命名空间来污染吗?

我应该坚持认为类(class)的做法就是正确的方式吗?

最佳答案

根据你所说的,我认为你想要做的是缓存一个值。这可以通过使用函数属性很容易地完成,并且不会侵入其他命名空间。

def my_func(context, data):
try:
reference, saved = my_func.cache
except AttributeError:
reference, saved = None, None
computed = saved if reference == context else foo(context)
my_func.cache = context, computed
return bar(computed, data)

关于python - 我可以使用(误用)globals() 命名空间来进行持久存储吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14241596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com