You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行时通过调试器确定名称对应的对象路径?

如何在调试器中找到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:02:48