2016-08-14 8 views
1

これは、RPC(リモートプロシージャコール)を実行すると他のホストへのTCP接続が行われるため、キャッシュで拡張したい機能のスケルトンです。functoolsでパラメータを無視する方法。 lru_cache?

def rpc(rpc_server, rpc_func, arg): 
    return rpc_server.do_rpc(rpc_func, arg) 

しかし、単純にそれを飾るの最も便利な方法:rpc_serverオブジェクトが来て行くと、このパラメータは、キャッシュによって無視されるべきであるbeacuse

@functools.lru_cache() 

は、うまく動作しません。

私は自分で簡単にメモを書くことができます。それに問題はない。実際には、私は他の解決策を見ません。

私は@lru_cache()デコレータが(つまり私はrpc_serverグローバル変数にする必要はありません)rpc_serverが引数として渡されます適用することができるような方法でこの機能を書き換えることができません。出来ますか?

+1

いいえ、私はそのような部分的なメモの作成は、あなた自身で書くよりも簡単にはできないと思います。 – jonrsharpe

答えて

1

私はこれを完成させるために転記しています。コメントは大歓迎ですが、投票しないでください。


私は私の質問からどのように条件を満たす方法を発見しました。私はこのコードを使用しません。しかし、これはPythonの柔軟性を示しています。

import functools 

class BlackBox: 
    """All BlackBoxes are the same.""" 
    def __init__(self, contents): 
     # TODO: use a weak reference for contents 
     self._contents = contents 

    @property 
    def contents(self): 
     return self._contents 

    def __eq__(self, other): 
     return isinstance(other, type(self)) 

    def __hash__(self): 
     return hash(type(self)) 

@functools.lru_cache() 
def _cached_func(blackbox, real_arg): 
    print("called with args:", blackbox.contents, real_arg) 
    return real_arg + 1000 

def cached_func(ignored_arg, real_arg): 
    # ignored means ignored by the cache 
    return _cached_func(BlackBox(ignored_arg), real_arg) 

cached_func("foo", 1) # cache miss 
cached_func("bar", 1) # cache hit 

cached_func("bar", 2) # cache miss 
cached_func("foo", 2) # cache hit 
関連する問題