0

曲のカバー/リミックス データをクエリするための json API をラップするモジュールがあり、1 時間/1 分あたりのリクエスト数に制限がありますユーザーが毎回キャッシュ/コンテキストパラメーターを調整することを強制せずに、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)

編集:おそらく、キャッシュあり/なしの2つの戦略のみを計画しています。

頭のてっぺんに思いつく他の代替初期化スキームには、環境変数の使用、ユーザーコードで_cacheを手動でNone / LFU()に初期化する、明示的なキャッシュをどこでも使用する(おそらくデフォルトでキャッシュを使用する)などがあります。

クラスのインスタンスにキャッシュを設定しない理由は、現在、インスタンス化されていないクラス (クラス関数 + クラス状態をシングルトンとして使用) を使用して、特定のものをダウンロードするためのいくつかの利便性/メソッドと共に json データのダウンロードを抽象化するためです。 URL。ダウンローダ クラスをインスタンス化することはできますが、インスタンスを各関数に明示的に渡すか、別のグローバル変数をクラスの便利なバージョンに使用する必要があります。また、ダウンローダ クラスはリクエスト数を追跡​​します (Web サイトには 1 分/時間あたりの制限があります)。そのため、複数のダウンローダ オブジェクトがあると、より多くの問題が発生します。

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]()

利用可能な戦略に便利なメソッドを提供したい場合は、単にラップしcaching_strategies.keys()ます。実際には、戦略に関する限り、おそらくすべての戦略をいくつかの基本戦略から継承し、そこから継承して標準化されたキャッシュ インターフェイスのすべてのメソッドをスタブ化する no_cache 戦略クラスを作成する必要があります。

于 2012-09-05T13:30:56.423 に答える