0

我有一个模块,它包装了一个 json api,用于查询歌曲封面/混音数据,并限制每小时/分钟的请求数。我想保留一个可选的 json 响应缓存,而不是强迫用户每次都调整缓存/上下文参数。在 python 中初始化库/模块的好方法是什么?或者你会建议我只做显式的事情,并在每次最终请求 json 数据的调用中使用缓存命名参数吗?

我正在考虑做

_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 数据以及一些方便/方法来下载某些网址。我可以实例化下载器类,但是我必须将实例显式传递给每个函数,或者使用另一个全局变量来获得该类的便利版本。下载器类还跟踪请求数(网站每分钟/小时有限制),因此拥有多个下载器对象会导致更多麻烦。

4

1 回答 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]()

如果您想为可用策略提供方便的方法,只需 wrap caching_strategies.keys()。但实际上,就您的策略而言,您可能应该让您的所有策略都从某个基本策略继承,并且只需创建一个继承自该基本策略的 no_cache 策略类,并为您的标准化缓存接口存根所有方法。

于 2012-09-05T13:30:56.423 回答