2012-09-05 146 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策略类,继承该策略并为所有标准缓存接口存根。