PAYATHON 2026

如何避免 debugpy 调试时求值数据库属性?

数据小许

结论

PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT 用于设置慢属性警告的阈值。它不会取消属性访问超时。将它设为 0,不能据此认为属性求值会被关闭,也不能指望它中断正在执行的数据库查询。debugpy 没有可在 launch.json 中配置的通用选项,能按对象或当前栈帧禁止属性求值。

调试器检查对象属性时,pydevd 的默认解析器会调用 getattr(),可能触发 @property 等描述符。访问完成后,解析器才会记录耗时并检查是否需要报告慢属性。因此,警告出现时,耗时操作已经发生。pydevd 属性解析器 launch.json 已列出的调试选项中,也没有通用的“禁用属性求值”开关。debugpy 调试配置

调整警告阈值

可以在对应的 launch.json 配置中设置环境变量。这个变量只决定何时触发慢访问警告,不会让 getter 提前返回:

{
  "name": "Python: Current File",
  "type": "debugpy",
  "request": "launch",
  "program": "${file}",
  "env": {
    "PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT": "2"
  }
}

这里的 2 表示将警告阈值设为 2 秒。实际单位以及 0 的边界行为可能因 pydevd 版本而异,因此不要把 0 当作取消或禁用属性访问的方法。警告中显示的 30.00s 是该次访问的耗时,单凭这条警告无法判断这个耗时上限是否由该变量控制。

避免调试器触发数据库查询

  • 在 VS Code 的 Variables 面板中,不要展开会触发查询的对象。检查其他局部变量时,也要避免将该对象放入自动求值的监视表达式或调试表达式。
  • 如果对象的实例字段存放在 __dict__ 中,可以尝试在 Debug Console 中查看 vars(obj),其中只会显示已存储的字段。@property 计算出的属性通常不在 vars(obj) 中;使用 __slots__ 的对象也未必有 __dict__。
  • 如果需要在调试时查看对象状态,可以将数据库访问改为显式方法调用,或缓存查询结果。这样调试器读取属性时就不会执行数据库操作。具体调整方式取决于对象的实现。

如果对象没有展开、也没有被监视,慢访问警告却仍然出现,可以检查 VS Code 的 Watch 列表、断点条件和调试表达式,看其中是否引用了该对象或它的属性。调整警告阈值无法阻止这些表达式执行。

备注:内容仅供参考。