亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何創建一個其值在文件重新加載后仍然存在的變量?

如何創建一個其值在文件重新加載后仍然存在的變量?

慕標琳琳 2021-11-09 20:11:50
Common Lisp 有defvarwhich 創建一個全局變量,但只有在它是新的時才設置它:如果它已經存在,則不會重置。這在從長時間運行的交互式進程重新加載文件時很有用,因為它會保留數據。我想在 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我想避免的值丟失了。我如何保持cache跨越reload?附注。我想我可以遵循如何檢查變量是否存在?:if 'cache' not in globals():   cache = {}但由于某種原因它看起來不像“Pythonic”......如果它是TRT,請告訴我!
查看完整描述

2 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

這里有幾個選項。一種是使用臨時文件作為緩存的持久存儲,并在每次加載模塊時嘗試加載:


# 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


查看完整回答
反對 回復 2021-11-09
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

由于重新加載的全部目的是確保執行的模塊的代碼第二次運行,因此基本上無法避免某種“重新加載檢測”。

您使用的代碼似乎是您參考的問題中給出的最佳答案。


查看完整回答
反對 回復 2021-11-09
  • 2 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號