23

私はxlwt、Excel ドキュメントで定義できるスタイルの数に 4k の制限があるものを使用しています。

通常、次のようなスタイルを作成します。

style = xlwt.easyxf("font: bold 1")

私は単に置き換えました

def cached_easyxf(self, format):
    return self._cache.setdefault(format, xlwt.easyxf(format))

これは完璧に機能します。ここで、キーワード引数を渡す必要がある場合があることがわかったので、考えさせられました: args/kwargs 署名をどのようにハッシュすればよいでしょうか?

str(value) に基づいてキャッシュ キーを作成する必要がありますか? ピクルス?最も堅牢なものは何ですか?

私の状況では、キー/値を文字列に変換してキーに追加するだけのように見えます...しかし、ハッシュ化できないタイプなどでこれを処理する一般的な方法に興味がありますarg=[1, 2, 3]

def cached_call(*args, **kwargs):
    return cache.get(what_here)
cached_call('hello')
cached_call([1, 2, 3], {'1': True})
4

1 に答える 1

24

functools.lru_cache()で使用される手法は次のとおりです。

kwd_mark = object()     # sentinel for separating args from kwargs

def cached_call(*args, **kwargs):
    key = args + (kwd_mark,) + tuple(sorted(kwargs.items()))
    return cache.get(key)

上記のコードはキーワード引数を処理しますが、リストのようなハッシュ不可能な値を処理しようとはしないことに注意してください。リストのstrを使用するためのあなたのアイデアは、合理的な出発点です。セットオブジェクトの場合、最初にエントリを並べ替える必要がありますstr(sorted(someset))。他のオブジェクトには、有用な__repr__または__str__がない場合があります(つまり、オブジェクトタイプとメモリ内の場所のみが表示される場合があります)。要約すると、ハッシュできない任意の引数を処理するには、各オブジェクトタイプを慎重に検討する必要があります。

于 2012-04-19T02:37:25.657 に答える