记住Python中的一些函数参数

时间:2015-09-16 16:50:11

标签: python caching

假设我有一个函数,它接受一个表示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

0 个答案:

没有答案