2012-04-19 15 views
11

私はxlwtと一緒に働いていますが、エクセルの文書で定義できるスタイルの数には4kの制限があります。関数キャッシュのために* args ** kwargsをハッシュするには?

通常、1がそうのようなスタイルを作成します。私は単純に完璧に動作

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

に置き換え

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

を。さて、私はキーワード引数を渡す必要があることを知りました。私は、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}) 

答えて

10

が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(sorted(someset)))。他のオブジェクトには便利な__repr__や__str__がない場合があります(つまり、オブジェクトの種類と場所のみがメモリに表示される場合があります)。要約すると、任意の解けない引数を処理するには、各オブジェクト型を慎重に検討する必要があります。

+1

お返事ありがとうRaymond!非常に高く評価されました –

+0

次のように動作しますか? 'key =(args、tuple(sorted(kwds.items()))'?または内側のタプルのために遅いですか? – max

+0

@maxはい、うまくいくでしょう。そして、はい、余分なポインタだけでなく、もう少しメモリを消費するビットを遅くなります。 –