初始化模块python

时间:2012-09-05 13:20:33

标签: python module initialization

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

我在考虑做

_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 :(得分: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策略类,继承自那个并且存根标准化缓存接口的所有方法。