假设我有一个函数,它接受一个表示Web浏览器的对象并使用它来抓取一个网页。我可能会在程序中的某个位置再次关注该URL,并且我希望将页面缓存以再次加载它。但诀窍是,我可能在那时使用不同的浏览器对象。我很高兴从缓存中获取值,但lru_cache(和大多数其他memoization系统)将根据不同的浏览器参数考虑两个不同的调用。我想知道在忽略某些函数参数的同时使用memoization是否很好。我在下面所得到的既不好也不可重复使用。
from functools import lru_cache
class Browser(object):
"""Pretend this is a Browser from mechanize"""
count = 0
def __init__(self):
self.count = Browser.count
Browser.count += 1
print("Created browser #{}".format(self.count))
def get_url(self, url):
"""Pretend we're actually doing something here"""
print("...Browser #{} visiting {}".format(self.count, url))
return url[::-1]
@lru_cache()
def _get_url(url):
return _get_url.browser.get_url(url)
_get_url.browser = None
def get_url(browser, url):
_get_url.browser = browser
return _get_url(url)
for url in "www.python.org www.yahoo.com www.python.org".split():
browser = Browser() # Imagine that we periodically switch to a different Browser instance
print("{} => {}".format(url, get_url(browser, url)))
输出:
Created browser #0
...Browser #0 visiting www.python.org
www.python.org => gro.nohtyp.www
Created browser #1
...Browser #1 visiting www.yahoo.com
www.yahoo.com => moc.oohay.www
Created browser #2
www.python.org => gro.nohtyp.www