jupyter notebook 原生不支持函数级代码折叠,仅支持单元格级输入/输出折叠;左侧小三角仅存在于 jupyterlab 中,依赖语言服务器解析缩进结构;notebook 中的“折叠”实为输出区隐藏,非语法感知折叠。

Jupyter Notebook 默认不支持函数级或代码块级折叠,只支持整个单元格(cell)的输入/输出区域折叠。想实现类似 IDE 的逐层折叠(比如 def、if、for 块),必须换用 JupyterLab 或启用第三方扩展。
为什么 Notebook 里点不了左侧小三角?
原生 Jupyter Notebook(非 Lab)没有语法感知能力,它只识别两种折叠行为:cell.metadata.collapsed(折叠整个输入框)和 cell.output_collapsed(折叠输出区)。左侧竖条或小三角仅在 JupyterLab 中由 Language Server 解析 Python 缩进结构后渲染——Notebook 界面压根不加载对应逻辑。
- 你在 Notebook 里看到的“可折叠”效果,其实只是点击单元格左侧灰色竖条时隐藏/显示
output区域,不影响代码本身 -
Shift+Click左侧竖条可折叠当前 cell 的输出;Ctrl+Click折叠所有 cell 输出(部分旧版本不支持) - 手动设置
cell.metadata.collapsed = True后需调用cell.render()才生效,且该状态保存在.ipynb文件的 metadata 中
JupyterLab 开启代码折叠的正确配置
JupyterLab 2.0+ 默认启用基于缩进的代码折叠,但需确认 notebook 设置已开启。直接修改用户配置即可,无需插件:
- 打开 Settings → Advanced Settings Editor → Notebook
- 在右侧「User Preferences」栏粘贴以下 JSON:
{"codeCellConfig": {"codeFolding": true}}
- 保存后重启 Lab,代码单元格左侧会出现小三角图标,点击即可折叠
def、class、if、for等缩进块 - 注意:该功能依赖 Python 语言服务器(如
pylsp),若未安装或崩溃,折叠图标会消失——运行jupyter labextension list查看@jupyterlab/python-language-server是否启用
想在 Notebook 里强行加折叠按钮?小心兼容性断裂
有人用 jupyter-themes 或自定义 custom.js 在 Notebook 工具栏注入“折叠全部代码”按钮,原理是遍历所有 cell 并设 cell.metadata.collapsed = true。但这只控制输入框显隐,不是真正语法折叠。
- 这类脚本依赖已弃用的
IPython.notebookAPI,在 Jupyter Notebook 7.x(基于 Jupyter Server)中大概率失效 - 按钮点击后,所有代码 cell 变成一行高,但无法展开单个函数——你失去的是局部控制权
- 如果用了
nbextensions的Collapsible Headings,它只对 Markdown 标题生效,和代码无关
真正要管理复杂 PyTorch 或数据处理脚本,别硬改 Notebook;直接切到 JupyterLab,或者用 VS Code + Jupyter 插件——后者折叠精度更高,还支持鼠标悬停预览折叠内容。Notebook 的定位是轻量演示,不是代码编辑器。











