为什么模拟补丁适用于随机而不适用于 np?

Why mock patching works with random but not with np?

我有一个模块,其中许多不同的函数使用随机数或随机选择。 我正在尝试使用 mock 和 patch 来注入预选值来代替这些随机选择,但无法理解我收到的错误。

在我测试的功能中,我使用

np.random.randint

当我使用代码时

from unittest import mock
import random
mocked_random_int = lambda : 7
with mock.patch('np.random.randint', mocked_random_int):

我收到一条错误消息,没有名为 np 的模块。但是,numpy 被导入为 np,其他函数调用它也很好。

更令人困惑的是,如果我编辑上面的代码以删除前面的 'np',它会做我想要的:

with mock.patch('random.randint', mocked_random_int):

但我想了解为什么代码在没有 np.谢谢!

在任何给定的命名空间中,模块或包名称与分配给它的变量之间存在差异。一个简单的导入

import numpy

告诉 python 检查其导入的模块列表,必要时导入 numpy,并将模块分配给变量“numpy”

import numpy as np

几乎是一样的,除了你分配给一个变量“np”。它仍然是同一个 numpy 包,只是你给它取了不同的别名。

mock.patch 将导入和修补模块,无论您是否已经导入它,但您需要提供模块名称,而不是您当前模块的模块别名。