2015-04-28 10 views
4

Я использую следующий декоратор кэшировать чисто функция возвращает:Как очистить кеш memoize?

def memoize(obj): 
    cache = obj.cache = {} 

    @functools.wraps(obj) 
    def memoizer(*args, **kwargs): 
     if args not in cache: 
      cache[args] = obj(*args, **kwargs) 
     return cache[args] 
    return memoizer 

Она работает довольно хорошо, но я бегу в проблему с юнит-тестов, таких как это:

class TestFoo(unittest.TestCase): 

    def setUp(self): 
     # clear the cache here 
     pass 

    @patch('module1.method1') 
    def test_method1_1(self, method1): 
     method1.return_value = "" 
     d = module1.method2() 
     self.assertTrue(len(d) == 0) 

    @patch('module1.method1') 
    def test_method1_2(self, method1): 
     method1.return_value = "TEST1234" 
     d = module1.method2() 
     self.assertTrue(len(d) == 2) 

Моя проблема заключается в том, что module1.method1 украшен memoize, поэтому из одного теста в другое его возвращаемое значение кэшируется и не изменяется с последующими method1.return_value = "..." заданиями.

Как можно очистить кеш memoize? Когда я это выясню, я очистил кеш в методе setUp тестового примера.

ответ

3

декоратор работает путем введения dictionnary в функции

Вы можете вручную ясно, что dictionnary:

@memoize 
def square (x): 
    return x*x 

square(2) 
square(3) 

print square.__dict__ 
# {'cache': {(2,): 4, (3,): 9}} 

square.cache.clear() 
print square.__dict__ 
# {'cache': {}} 

Вы можете использовать module1.method1.cache.clear() в методе TearUp

Смежные вопросы