launch.json 必须配置 justmycode 和 console:justmycode 为 true 可避免跳入第三方库,console 设为 integratedterminal 才能显示 print 输出并支持表达式输入。

launch.json 必须包含 justMyCode 和 console 配置项
不设 justMyCode 会导致调试器跳进第三方库源码,变量面板里堆满 site-packages 里的内部变量,真正想看的局部变量反而被淹没;不配 console 则调试控制台无法输入表达式,print() 输出也不会显示在终端里。
推荐配置片段:
{
"name": "Python File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": true
}
-
justMyCode设为false仅在你明确要调试requests或numpy内部逻辑时才用,日常开发应保持true -
console值选integratedTerminal(推荐)或internalConsole;选none会丢失所有print输出,且调试控制台无法执行赋值语句 - 如果项目用了自定义
PYTHONPATH,必须在env字段中显式声明,否则监视表达式里 import 模块会报ModuleNotFoundError
变量监视表达式不能写错作用域,否则显示 undefined 或空值
在“监视”面板里输 user.name 却看不到值?大概率是 user 还没初始化,或当前断点不在它的作用域内。VSCode 的监视表达式不会自动提升作用域,它只读取当前栈帧可见的符号。
- 函数内定义的变量(如
def f(): x = 1)在函数外断点处无法被监视 - 列表推导式或 lambda 里的临时变量(如
[x*2 for x in items]中的x)无法直接监视,需改用items[0]*2这类可求值表达式 - 监视
self.data前,确保断点落在类方法内,且self已完成初始化(比如不在__init__的super().__init__()之前) - 对字典或对象属性不确定是否存在时,可用安全访问语法:
user.get("name", "N/A")或getattr(user, "age", 0)
鼠标悬停失效时,优先检查 pydantic / dataclass 的字段是否被动态生成
悬停显示 None 或根本不出提示,常见于使用 @dataclass、pydantic.BaseModel 或 attrs 的类——它们的字段可能在运行时才注入,而 VSCode 的悬停依赖静态分析。
- 这类对象建议改用“监视”面板输入完整表达式,例如
my_obj.__dict__或my_obj.model_dump()(pydantic v2) - 如果用了
__slots__且未显式声明字段,悬停和变量面板都可能漏掉属性,此时必须靠调试控制台手动查:dir(my_obj) - 启用
"showGlobalVariables": true到launch.json的configurations里,能强制加载模块级全局变量,对调试配置类或常量表有帮助
调试控制台支持实时修改,但要注意类型和生命周期
在调试控制台输 count = 999 确实能改值,但它只影响当前栈帧,函数返回后就失效;更危险的是给不可变对象赋值,比如 my_tuple = (1, 2, 3) 后再输 my_tuple[0] = 9,会直接报 TypeError 并中断调试流。
- 修改列表/字典内容安全:
my_list.append(4)、my_dict["new"] = "val" - 重绑定变量名(
my_list = [])会切断原引用,后续代码若还依赖旧对象,行为可能意外 - 调用带副作用的方法(如
cache.clear())会影响后续逻辑,务必确认这是你想要的 - 用
$_获取上一次结果很省事,但注意它只保存最后一个表达式的返回值,不是变量快照
type(x) 和 hasattr(x, "__dict__"),往往比反复重启调试会话更有效。











