2012-09-05 187 views
0

我有一個module包裝一個JSON API查詢歌曲封面/混音數據與每小時/分鐘的請求數限制。我想保留json響應的可選緩存,而不是每次都強制用戶調整緩存/上下文參數。在python中初始化庫/模塊的好方法是什麼?或者你會推薦我只是做明確的事情,並在最終請求json數據的每個調用中使用緩存命名參數?初始化模塊python

我在想這樣做

_cache = None 

class LFU(object): 
    ... 

NO_CACHE, LFU = "NO_CACHE", "LFU" 
def set_cache_strategy(strategy): 
    if _cache == NO_CACHE: 
     _cache = None 
    else: 
     _cache = LFU() 

import second_hand_songs_wrapper as s 
s.set_cache_strategy(s.LFU) 
l1 = s.ShsLabel.get_from_resource_id(123) 
l2 = s.ShsLabel.get_from_resource_id(123,use_cache=Fale) 

編輯: 我可能只打算有兩種策略之一與/一個沒有高速緩存。

我能想到的其他可能的替代初始化方案包括使用環境變量,手動將用戶代碼中的_cache初始化爲None/LFU(),並在所有地方使用顯式緩存(可能默認爲有高速緩存)。

請注意,我沒有在類的實例上設置緩存的原因是,我目前使用從未實例化的類(使用類函數+類狀態作爲單例)來抽象下載json數據以及一些便利/方法來下載某些網址。我可以實例化下載器類,但是我必須將該實例顯式地傳遞給每個函數,或者使用另一個全局變量作爲該類的便利版本。下載者類也跟蹤請求數量(網站每分鐘/小時有限制),因此有多個下載器對象會導致更多麻煩。

+1

爲什麼不在模塊的實例上配置緩存策略? –

回答

0

設置默認值沒有任何問題,即使默認值爲None。我會注意到,雖然具有僞常量以及條件(只要您使用這些值)是多餘的。嘗試:

caching_strategies = {'NO_CACHE' : lambda: None, 
         'LFU' : LFU} 
_cache = caching_strategies['NO_CACHE'] 

def set_cache_strategy(strategy): 
    _cache = caching_methods[strategy]() 

如果您想爲現有策略的便捷方法,只是包裝caching_strategies.keys()。實際上,就策略而言,您應該可以讓所有策略都從一些基本策略繼承,然後創建一個no_cache策略類,繼承該策略併爲所有標準緩存接口存根。