这是我想通过缓存增强的函数的框架,因为执行RPC (远程过程调用)涉及到到其他主机的TCP连接。
def rpc(rpc_server, rpc_func, arg):
return rpc_server.do_rpc(rpc_func, arg)不过,最方便的方法是简单地用以下方式装饰它:
@functools.lru_cache()不能很好地工作,因为rpc_server对象来来去去,缓存应该忽略这个参数。
我可以自己写一个简单的回忆录代码。这没问题。事实上,我看不出其他的解决办法。
我无法以这样的方式重写这个函数,以至于@lru_cache()装饰器可以应用,和 rpc_server将作为参数传递(也就是说,我不想使rpc_server成为一个全局变量)。有可能吗?
发布于 2016-08-16 07:28:32
我发这篇文章只是为了追求完美。欢迎提出意见,但请不要投票。
我从我的问题中找到了一种满足条件的方法。我不打算用这段代码。但它展示了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 hithttps://stackoverflow.com/questions/38940954
复制相似问题