如何在运行时通过调试器确定名称对应的对象路径?
如何在调试器中找到unittest.mock.patch的正确路径?
使用unittest.mock.patch时,必须针对调用站点的正确对象路径才能生效,复杂导入结构下梳理这个路径很麻烦。我希望通过调试器,在调用目标对象前设置断点,直接获取实际被查找的对象路径(类似Shell的which命令),具体该怎么操作?
举个简单示例:a.py:
class SomeClass: pass
b.py:
from a import SomeClass def fn(): s = SomeClass() # 这里实际查找的是b.SomeClass,而非a.SomeClass
如果测试时用@patch('a.SomeClass')不会生效,必须用@patch('b.SomeClass')——但复杂场景下很难定位这个正确路径。
调试器中获取对象路径的实用方法
1. 直接查看对象的__module__和__qualname__
在断点处(比如fn内SomeClass()的前一行),在调试器中执行以下命令:
- 查看对象所属模块:
SomeClass.__module__→ 返回'b' - 查看对象的限定名称:
SomeClass.__qualname__→ 返回'SomeClass' - 拼接这两个值,就是
patch需要的路径:b.SomeClass
2. 遍历全局命名空间匹配对象
如果是模块级导入的对象,可以通过全局命名空间找到它在当前模块中的名称:
在调试器中运行:
for name, obj in globals().items(): if obj is SomeClass: print(name)
输出结果就是当前模块中该对象的名称(比如'SomeClass'),再结合当前模块的名称(__name__返回'b'),就能得到完整路径。
3. 用inspect模块快速生成完整路径
在调试器中临时导入inspect模块,直接获取完整路径:
import inspect mod = inspect.getmodule(SomeClass) print(f"{mod.__name__}.{SomeClass.__name__}")
这会直接输出可用于patch的完整路径,包结构下的模块会自动返回全限定包路径(比如my_package.b.SomeClass)。
内容的提问来源于stack exchange,提问作者2e0byo
相关产品推荐
相关产品推荐

