在单元测试期间全局禁用 joblib.memory 缓存

skj*_*rns 6 python caching unit-testing joblib

我使用该joblib.Memory模块来缓存多个模块中的一些函数。缓存在模块和类中分别初始化。

模块1:

memory = Memory(location='/cache/')
@memory.cache
def heavy_function(...)
    .....
Run Code Online (Sandbox Code Playgroud)

模块2:

memory = Memory(location='/cache/')
@memory.cache
def heavy_function2(...)
    .....
Run Code Online (Sandbox Code Playgroud)

模块3:

import Module1
import Module2

def heavy_function3(...)
    Module1.heavy_function1(...)
    Module1.heavy_function1(...)
    .....
Run Code Online (Sandbox Code Playgroud)

现在我有一个单元测试脚本,我想在单元测试期间全局禁用缓存的使用,以确保所有内容都正确计算。这是否可以在不通过 Module1.memory.cachedir=None或不删除缓存目录的情况下为每个模块手动禁用它?

我当前的解决方案只是手动修补每个内存调用

单元测试1:

from joblib import Memory
import Module1
Module1.memory = Memory(location=None)
...
unittest.run()
Run Code Online (Sandbox Code Playgroud)

单元测试3:

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()
Run Code Online (Sandbox Code Playgroud)

我创建的模块越多,我需要的手动修补的内存就越多。我想可能有更好的解决方案。我在下面提出了一种解决方法。

Dan*_*iel 1

您可以在导入时对其进行修补,如下所示:

with patch("joblib.Memory") as mock_memory:
    mock_memory.return_value.cache = lambda x: x

# then proceed with your tests
def test_whatever():
    assert True
    
Run Code Online (Sandbox Code Playgroud)

mock_memory.return_value.cache = lambda x: x设置 joblib.Memory.cache 返回输入,即它不会修改它修饰的函数。