Отключите глобальное кэширование joblib.memory во время юнит-теста - PullRequest
0 голосов
/ 15 ноября 2018

Я использую модуль joblib.Memory для кэширования некоторых функций в нескольких модулях. Кеш инициализируется внутри модулей и классов отдельно.

Module1:

memory = Memory(location='/cache/')
@memory.cache
def heavy_function(...)
    .....

Module2:

memory = Memory(location='/cache/')
@memory.cache
def heavy_function2(...)
    .....

Module3:

import Module1
import Module2

def heavy_function3(...)
    Module1.heavy_function1(...)
    Module1.heavy_function1(...)
    .....

Теперь у меня есть скрипт модульного тестирования, и я хочу отключить глобальное использование кэша во время модульного тестирования, чтобы убедиться, что все вычислено правильно. Это возможно без ручного отключения его для каждого модуля через Module1.memory.cachedir=None или без удаления кешира?

Мое текущее решение просто исправляет каждый вызов памяти вручную

unittest1:

from joblib import Memory
import Module1
Module1.memory = Memory(location=None)
...
unittest.run()

unittest3:

from joblib import Memory
import Module1 # need to import module 1 just to disable its memory
import Module2 # need to import module 2 just to disable its memory
import Modul3
Module1.memory = Memory(location=None)
Module2.memory = Memory(location=None)
...
unittest.run()

Чем больше модулей я создаю, тем больше ручного исправления Памяти мне нужно. Я думал, что может быть лучшее решение. Один обходной путь предложен мной ниже.

1 Ответ

0 голосов
/ 22 ноября 2018

Одним из обходных путей является установка флага или переменной среды при запуске тестов. Затем проверьте эти флаги перед инициализацией памяти:

Module1

import os
memflag = os.environ.get('UNITTESTING', False)
memory = Memory(location= None if memflag else '/cache/')
@memory.cache
def heavy_function(...)
    .....

unittest1

os.environ["UNITTESTING"] = '1'
import Module1
.....
unittest.run()
del os.environ["UNITTESTING"]
...