gpt4 book ai didi

python - 如何创建一个变量,其值在文件重新加载时保持不变?

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:15 25 4
gpt4 key购买 nike

Common Lisp 有 defvar哪个创建一个全局变量但仅在它是新的时设置它:如果它已经存在存在,重置。这在从长时间运行的交互式进程中重新加载文件时很有用,因为它保留了数据。

我想在 Python 中使用同样的方法。我有文件 foo.py,其中包含如下内容:

cache = {}
def expensive(x):
try:
return cache[x]
except KeyError:
# do a lot of work
cache[x] = res
return res

当我做 imp.reload(foo) ,我想要的 cache 的值丢失了避免。

如何在 reload 期间保持缓存

附言。我想我可以关注How do I check if a variable exists? :

if 'cache' not in globals():
cache = {}

但由于某种原因它看起来不像“Pythonic”...如果它 TRT,请告诉我!

回复评论:

  • 对交叉调用持久性感兴趣;我已经处理好了。
  • 痛苦地意识到重新加载会改变类元对象,我已经在处理这个问题了。
  • cache 中的值很大,我无法在每次需要时都访问磁盘。

最佳答案

这里有几个选项。一种是使用临时文件作为缓存的持久存储,并在每次加载模块时尝试加载:

# foo.py
import tempfile
import pathlib
import pickle

_CACHE_TEMP_FILE_NAME = '__foo_cache__.pickle'
_CACHE = {}

def expensive(x):
try:
return _CACHE[x]
except KeyError:
# do a lot of work
_CACHE[x] = res
_save_cache()
return res

def _save_cache():
tmp = pathlib.Path(tempfile.gettempdir(), _CACHE_TEMP_FILE_NAME)
with tmp.open('wb') as f:
pickle.dump(_CACHE, f)

def _load_cache():
global _CACHE
tmp = pathlib.Path(tempfile.gettempdir(), _CACHE_TEMP_FILE_NAME)
if not tmp.is_file():
return
try:
with tmp.open('rb') as f:
_CACHE = pickle.load(f)
except pickle.UnpicklingError:
pass

_load_cache()

唯一的问题是您需要相信环境不会在临时文件的位置写入任何恶意内容(pickle 模块对于错误或恶意构造的数据不安全)。

另一种选择是使用另一个模块作为缓存,一个不会重新加载的模块:

# foo_cache.py
Cache = {}

然后:

# foo.py
import foo_cache

def expensive(x):
try:
return foo_cache.Cache[x]
except KeyError:
# do a lot of work
foo_cache.Cache[x] = res
return res

关于python - 如何创建一个变量,其值在文件重新加载时保持不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54711295/

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