本質上,我想在堆棧上放置一個變量,該變量可通過堆棧下面的所有調用訪問,直到塊退出。在Java中,我會使用支持方法的本地靜態線程解決此問題,然後可以從方法訪問。如何將變量放在Python中的堆棧/上下文中
典型示例:獲取請求並打開數據庫連接。在請求完成之前,您希望所有代碼都使用此數據庫連接。完成並關閉請求後,關閉數據庫連接。
我需要的是一個報告生成器。每個報告由多個部分組成,每個部分可以依賴於不同的計算,有時不同的部分部分依賴於相同的計算。由於我不想重複繁重的計算,我需要緩存它們。我的想法是用緩存修飾器來裝飾方法。緩存根據方法名稱和模塊創建一個id,它是參數,查看它是否已經在堆棧變量中計算了這個值,如果沒有,則執行該方法。
我會試着通過顯示我當前的實施來清除。我想要做的是簡化那些實現計算的代碼。
首先,我有中央高速緩存訪問對象,我稱之爲的MathContext:
class MathContext(object):
def __init__(self, fn):
self.fn = fn
self.cache = dict()
def get(self, calc_config):
id = create_id(calc_config)
if id not in self.cache:
self.cache[id] = calc_config.exec(self)
return self.cache[id]
使用fn參數是上下文有關創建的,文件名從那裏可以讀取的數據來計算的。
然後我們計算類:
class CalcBase(object):
def exec(self, math_context):
raise NotImplementedError
這裏是一個愚蠢的斐波那契數的例子。方法非實際上是遞歸的,他們在大集,而不是數據的工作,但它的作品來證明你將如何依賴於其他計算:
class Fibonacci(CalcBase):
def __init__(self, n): self.n = n
def exec(self, math_context):
if self.n < 2: return 1
a = math_context.get(Fibonacci(self.n-1))
b = math_context.get(Fibonacci(self.n-2))
return a+b
我想斐波那契數是不是,只是一種裝飾方法:
@cache
def fib(n):
if n<2: return 1
return fib(n-1)+fib(n-2)
通過math_context示例,當math_context超出作用域時,所有緩存值也是如此。我想爲裝飾者做同樣的事情。 IE瀏覽器。在X點,@cache緩存的所有內容都被取消爲gced。
這個設計有什麼問題?看上去不錯。看起來它滿足你的需求。也許你應該更新你的問題,以顯示你想要改變這個代碼的位置或方式。或者這個代碼做得不好。 – 2009-06-16 15:43:09
最後一點是我想要的,但不知道如何實現。目前的設計是好的,但我覺得這是要輸出詳細。我寧願使用裝飾方法,因此使用和書寫變得更簡單。 IE瀏覽器。它正在清理當前的設計。 – Staale 2009-06-16 16:13:29