如何在被__init__.py遮蔽的模块中Patch module_b方法?
解决方案
你可以通过直接修改some_module.module模块对象的module_b属性来实现patch,具体修改main.py如下:
# main.py # 先导入模块对象 import some_module.module # 替换模块中的module_b some_module.module.module_b = lambda: print("other module") # 再导入并调用module函数 from some_module.module import module module()
运行后输出符合预期:
In module other module
原理说明
module()函数调用module_b()时,会去它所在的some_module.module模块全局命名空间中查找module_b。只要在调用module()前修改该模块对象的module_b属性,函数运行时就会使用替换后的lambda函数。
临时patch方案(适合测试场景)
如果需要临时替换、退出后自动恢复原函数,可以用Python标准库的unittest.mock.patch:
# main.py from unittest.mock import patch from some_module.module import module with patch('some_module.module.module_b', lambda: print("other module")): module()
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

