gpt4 book ai didi

python - 被其他模块使用的假模块

转载 作者:行者123 更新时间:2023-11-30 23:37:35 28 4
gpt4 key购买 nike

是否有可能伪造模块,该模块被我在测试中使用的其他模块使用(导入)?

示例:这是我的测试.py:

import unittest 
import module1
//test code here
module1.some_method()
//test code here

这是 module1.py:

import module_i_want_to_fake
//module code here

基于示例:问题是:如何在 test.py 中伪造 module_i_want_to_fake

最佳答案

当您执行 import foo 时,如果 sys.modules['foo'] 已经存在,解释器只会返回它,而不是进行新的导入。

因此,要伪造 module1import 语句,只需在加载 module1 之前填充值即可。这有点 hacky,但非常简单。例如:

mytest.py:

import sys
import unittest
import my_fake_module
sys.modules['module_i_want_to_fake'] = my_fake_module
import module1
//test code here
module1.some_method()
//test code here

模块1.py:

import module_i_want_to_fake
print(module_i_want_to_fake)

这将打印出如下内容:

<module 'my_fake_module' from 'my_fake_module.pyc'>

如果您需要更彻底地伪造 module1 (即使它尝试内省(introspection)模块),您可以使用以下命令创建一个新模块(通过 types.ModuleType):来自 my_fake_module 的代码,但名称为 'module_i_want_to_fake',以及您想要的任何其他更改。

如果您需要比通过提前静态重命名模块更动态地执行此操作,您可以构建一个导入 Hook ,如 PEP 302 中所述。 。这需要您重新实现导入机制的很大一部分,这在 2.x 中是一个巨大的痛苦,但是 importlib 3.1+ 让它变得更容易。

幸运的是,通常您不需要执行这些操作。

关于python - 被其他模块使用的假模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15395988/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com