【发布时间】:2026-02-13 10:35:01
【问题描述】:
这更多是为了理解 Python(在本例中为 3.9)是如何工作的,而不是为了解决实际问题,所以请多多包涵,不要理会 m3 的荒谬方式。我只是想复制我正在处理的东西。
我有以下结构:
├── m1.py
└── m2
└── m3
├── __init__.py
└── m3.py
m2/m3/init.py:
from .m3 import *
m2/m3/m3.py:
def m3func():
print('m3 func is here')
从现在开始,我将对 m1.py 进行更改
这是有效的,我期待它有效:
import m2.m3
m2.m3.m3func()
这并没有失败,因此它替换了 Mock 的模块。我也期待它能够以它的方式工作。
import sys
from unittest.mock import Mock
sys.modules['m2.m3'] = Mock()
import m2.m3 as alias
alias.m3func()
这个也一样
import sys
from unittest.mock import Mock
sys.modules['m2.m3'] = Mock()
from m2 import m3
m3.m3func()
我不明白这里发生了什么:
import sys
from unittest.mock import Mock
sys.modules['m2.m3'] = Mock()
import m2.m3
m2.m3.m3func()
m2.m3.m3func()
AttributeError: module 'm2' has no attribute 'm3'
import m2.m3、from m2 import m3 和 import m2.m3 as alias 有什么区别
我还有什么不明白的,有没有办法修复最后一个版本,这样它就不会抛出 AttributeError?我的示例 m2 是空的,但实际上,我不想完全换掉它,因为它确实包含我关心的东西。我只想针对 m3。关于使用这样的代码的最佳实践是否有建议:m2.m3.m3func()?
【问题讨论】:
-
m2中有__init__.py吗? -
不,但如果需要我可以添加一个。
-
看看会发生什么
-
我得到同样的错误
-
你应该为你喜欢的答案投票,而不仅仅是选择它们
标签: python python-3.x unit-testing python-importlib