Jupyter Notebook Exercise 扩展:用可折叠“习题/答案“组织教学 Notebook(实现原理与演进史解析)
开发工具前端【免费下载链接】jupyter_contrib_nbextensionsA collection of various notebook extensions for Jupyter项目地址https://gitcode.com/gh_mirrors/ju/jupyter_contrib_nbextensions点击查看免费下载Exercise及其姊妹版 Exercise2是jupyter_contrib_nbextensions仓库中专门用于把多个连续单元格组织成练习题 隐藏答案的 Notebook 扩展选中一组单元格后一键生成练习答案区默认折叠点击单元格内的控件即可展开/收起并且隐藏/显示状态会写入单元格元数据、在重启与刷新后自动恢复。本文以扩展目录内的 history.md 为脉络主线结合 readme.md、main.js 等源码文件完整讲解它的操作方式、配置项、底层元数据机制以及从 2014 年到 2017 年的关键演进读完后你可以在自己的教学或培训 Notebook 中直接复刻这套练习折叠方案。一、功能概述两个扩展、同一套思路Exercise 与 Exercise2 是两个使用相同代码骨架、仅在单元格控件形态上有差异的扩展见 exercise/readme.md 与 exercise2/readme.md扩展单元格控件形态默认快捷键来自 readme 与 main.js元数据键exercise一个带加减号的按钮fa-plus-square-o/fa-minus-square-o图标前置到标题单元格Alt-Ssolution、solution_firstexercise2一个滑动式开关onoffswitch 复选框带 CSS 样式追加到标题单元格Alt-Dsolution2、solution2_first两者都提供一个菜单栏/工具栏按钮负责创建或移除练习一个单元格级控件负责展开/收起答案区。两个扩展可以同时启用、互不干扰依赖的只是 Notebook 自身的多选能力详见下文。二、核心操作实战创建练习先在 Notebook 中选中一组连续单元格然后点击工具栏按钮扩展会以第一个单元格作为标题/问题单元格在标题单元格上添加展开/收起控件将其余单元格设为hidden默认隐藏作为答案区。多选方式readme 与 history 共同说明键盘多选Shift-J选择下一个/Shift-K选择上一个鼠标框选借助rubberband扩展拖拽框选新版 Notebook 多选 API 自带的Shift-Up/Shift-Down连续选择。readme 特别强调一个操作要点点击菜单按钮时请按住 Shift 键不放Do not forget to keep the Shift key pressed down while clicking on the menu buttonotherwise selected cells will be lost否则已选中的单元格可能会丢失。此外也可以直接使用快捷键Alt-Sexercise或Alt-Dexercise2把当前选中区变成练习。移除练习选中一个练习的标题第一个单元格后再次点击工具栏按钮或按快捷键该练习即被移除所有答案单元格恢复显示。展开/收起答案练习创建后答案默认隐藏。点击标题单元格上的加减号按钮exercise或滑动开关exercise2即可切换隐藏/显示状态。状态持久化练习的隐藏还是显示状态会被保存到单元格元数据中在重启 Notebook 或刷新页面后自动恢复。这是 history.md 中 2015 年 10 月更新引入的核心能力之一详见第五节。三、配置参数与安装启用两个扩展的配置元数据文件 exercise.yaml 与 exercise2.yaml 声明了相同的三个可配置参数参数名类型默认值作用add_buttoncheckboxtrue是否在工具栏添加创建/移除练习按钮use_hotkeycheckboxtrue是否注册创建/移除练习的键盘快捷键hotkeyhotkey见下文说明实际使用的快捷键组合需要说明的一点细节readme 与两个main.js中cfg的默认值是 exercise 用Alt-S、exercise2 用Alt-D见 exercise/main.js 与 exercise2/main.js而两个 yaml 文件里hotkey字段的默认值都标注为Alt-D仓库内文档与源码存在这一细微出入。实际生效值以main.js中cfg与用户在 configurator 里的设置为准——load_ipython_extension会通过IPython.notebook.config.data深合并用户配置来覆盖默认值。两个扩展的兼容性声明均为 Notebook 4.x、5.x。安装与启用根据 docs/source/install.md 的标准流程pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user # 将 JS/CSS 复制到 Jupyter 数据目录 jupyter nbextension enable exercise/main # 启用 exercise jupyter nbextension enable exercise2/main # 启用 exercise2可选也可以在树状页面打开nbextensions标签页通过jupyter_nbextensions_configurator勾选启用并在同一界面里调整add_button、use_hotkey、hotkey三个参数。四、源码级实现原理元数据契约这是整套机制的核心。创建练习时扩展在单元格上写入如下元数据见 readme 的 Internals 一节并在 exercise/main.js 与 exercise2/main.js 中得到印证solutionexercise/solution2exercise2值为hidden或shown记录该单元格所属答案区的当前显隐状态solution_firstexercise/solution2_firstexercise2标记练习的第一个单元格用于快速识别练习起点从而支持在同一个 Notebook 里连续排列多个练习。因为状态是纯元数据所以天然具备持久化能力Notebook 的.ipynb文件保存了这些字段重启后扩展可以据此重建界面状态。创建/移除逻辑create_remove_exercise()的流程exercise 版exercise2 版结构相同通过IPython.notebook.get_selected_cells()取得选中单元格若为空则弹出提示并返回若第一个单元格已带solution_first标记则进入移除分支删除控件、删除solution_first与solution元数据并沿get_next_cell()遍历后续带有solution的单元格逐一removeClass(hidden)恢复显示否则进入创建分支给第一个单元格写入solution_first true、solution hidden调用add_element()挂载控件并把其余选中单元格全部addClass(hidden)且写入solution hidden。显隐切换逻辑click_solution_lock()负责切换读取标题单元格的solution元数据翻转hidden/shown同步更新控件外观然后沿get_next_cell()遍历该练习内部的后续单元格判断条件为带solution且不带solution_first逐个toggleClass(hidden, ...)并同步元数据。遍历终止条件正是利用了solution_first标记——到达下一个练习的起点时立即停止多个练习互不串扰。启动恢复逻辑refresh_exercises()会在notebook_loaded.Notebook事件触发或_fully_loaded时立即执行遍历全部单元格遇到带solution/solution_first的单元格时重建控件并依据元数据中的hidden/shown值恢复各答案单元格的显隐。这就是刷新/重启后状态自动还原的源码依据。两种 Widget 的差异exercise 用add_element()把$(div classexercise fa)prependTo到标题单元格控件图标在fa-plus-square-o隐藏可展开与fa-minus-square-o显示可收起之间切换exercise2 则先给标题单元格设置flex-wrap: wrap再appendTo一个由onoffswitch复选框 滑块组成的滑动开关HTML 片段见 exercise2/main.js样式细节见 exercise2/main.css开关文案为 Hide Solution / Show Solution。五、演进历史全解析history.md 主线history.md 本身就是这份扩展的演进记录逐条展开如下。2014 年 10–11 月初版juhasch扩展的早期版本由 juhasch 编写。这一阶段的实现要求被选中的单元格在元数据中带有selected标记才能组成练习交互与容错都比较原始。2015 年 10 月 21–27 日迁移到 Multicell APIjfbercher这是 history.md 着墨最多的一次重构共四点接入 Notebook 多选 API多选不再依赖手工写入selected元数据而是可以直接使用rubberband扩展框选或用Shift-J选择下一个/Shift-K选择上一个快捷键选择。点按工具栏按钮即可把所选单元格整体变成默认隐藏的solution。history 同时记录当时Shift-Up/Shift-Down预计不久后也会生效readme 后来已将其列为可用多选方式。状态持久化solution 的隐藏/显示状态被写入solution元数据页面重载/内核重启后自动恢复。修复边界缺陷修正了练习定义在 Notebook 底部边缘时触发无限循环的问题。新增快捷键增加Alt-SS 代表 Solution用于快速创建/移除练习。2015 年 12 月 22 日solution_first支持连续练习本次更新为练习起点增加了solution_first元数据标记。在此之前扩展只能识别一个练习无法区分连续排列的多个练习有了该标记后遍历答案区时遇到下一个练习的起点即可安全终止同一 Notebook 中可以有多个连续练习互不干扰。2015 年 12 月 30 日适配 Notebook 4.1.x本次更新把扩展升级到兼容 Jupyter Notebook 4.1.x 系列保证在新版前端 API 下继续工作。2017 年 12 月源码注释补充与 collapsible_headings 协同history.md 未收录但在 exercise/main.js 与 exercise2/main.js 的头部注释中记录了 2017 年 12 月 6 日 jcb91 的改动改用 Bootstrap 的hidden类来实现折叠从而与同仓库的collapsible_headings扩展良好共处。这说明隐藏的实现从自定义样式统一到了 Notebook 的 Bootstrap 基础设施上。六、与其他扩展的协作及适用边界rubberbandreadme 声明两个扩展需要安装并启用 rubberband而 history 显示迁移到 Multicell API 后Shift-J/Shift-K等键盘多选也可独立完成选择。值得一提的是 rubberband/readme.md 自身标注仅适用于 IPython 3.x因此在新版 Notebook 上更推荐直接用内置多选快捷键。rubberband 的框选交互本身也很直观Shift 鼠标左键拖拽选择当前触碰的单元格CtrlShift 左键拖拽保留此前触碰过的选区。collapsible_headings2017 年的改动让两者的折叠样式都依赖 Bootstraphidden可以同时生效。适用边界与仓库内绝大多数 nbextension 一样它们面向经典 Jupyter Notebook 前端yaml 声明兼容 4.x、5.x不适用于 JupyterLab教学场景下请确认目标环境为 Notebook 前端。小结Exercise / Exercise2 用元数据驱动状态这一朴素而可靠的设计实现了教学 Notebook 中最常用的习题 可折叠答案交互其演进史selected元数据 → Multicell API →solution_first→ 4.1.x 适配 → Bootstrap hidden 统一本身就是一份理解 Notebook 前端 API 变迁的绝佳案例。如果你需要在课程材料中复用这套方案直接启用扩展、按选中 → 点按钮/按快捷键 → 点击控件三步即可上手。赞分享开发工具前端【免费下载链接】jupyter_contrib_nbextensionsA collection of various notebook extensions for Jupyter项目地址https://gitcode.com/gh_mirrors/ju/jupyter_contrib_nbextensions点击查看免费下载相关推荐Jupyter 练习答案隐藏扩展Exercise / Exercise2使用指南基于 jupyter_contrib_nbextensions 的答案单元格折叠方案Jupyter 练习答案隐藏扩展Exercise / Exercise2使用指南基于 jupyter_contrib_nbextensions 的答案单元开发工具前端Jupyter Contrib Nbextensions 之 Collapsible Headings可折叠标题扩展的配置、原理与导出实战Jupyter Contrib Nbextensions 之 Collapsible Headings可折叠标题扩展的配置、原理与导出实战 导读 Collap开发工具前端Jupyter Notebook 7 配置全景指南公共配置系统、Jupyter Server 与 Notebook 扩展实战Jupyter Notebook 7 配置全景指南公共配置系统、Jupyter Server 与 Notebook 扩展实战 Jupyter Notebook后端前端数据科学上一篇macOS防火墙LuLu终极指南三小时掌握开源防火墙的完整实战配置下一篇Exercises Dataset与AI集成使用机器学习生成个性化训练计划创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OCRmyPDF离线部署指南:断网内网一次搞定扫描OCR

OCRmyPDF离线部署指南:断网内网一次搞定扫描OCR

OCRmyPDF离线部署指南:断网内网一次搞定扫描OCR 【免费下载链接】OCRmyPDF OCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched 项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF 矿区笔记本上的那份图纸 地质…

2026/10/13 5:58:39 阅读更多 →
SpringMVC通用数据权限校验框架:从设计到实战

SpringMVC通用数据权限校验框架:从设计到实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:58:39 阅读更多 →
AnyPS5实战:用开源面板统一管理PS5游戏库与远程串流

AnyPS5实战:用开源面板统一管理PS5游戏库与远程串流

AnyPS5 这个名字听起来像是一台主机,其实它是我折腾的一个本地工具项目。起因很简单:我手里的游戏、账号、主机状态越来越散,数字版躺在不同账号里,光盘版挤在书架上,想远程玩一把还得分清哪台机器、哪个账号、哪次打折…

2026/10/13 5:57:39 阅读更多 →

最新新闻

连接器可靠性试验:振动、冲击、碰撞三者的区别与工程选择

连接器可靠性试验:振动、冲击、碰撞三者的区别与工程选择

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 6:42:49 阅读更多 →
AnyPS5跨平台串流实战:主机编码、网络传输与客户端解码全解析

AnyPS5跨平台串流实战:主机编码、网络传输与客户端解码全解析

1. 从“AnyPS5”这个标题说起:一个跨平台串流工具的设计野心第一次看到“AnyPS5”这个命名,我的直觉是:这大概率是一个围绕主机游戏串流展开的项目,而且“Any”这个前缀暗示了它的核心卖点——跨平台、跨设备、尽可能抹平硬件壁垒…

2026/10/13 6:42:49 阅读更多 →
谱减法语音增强实战:从原理到参数调优的完整指南

谱减法语音增强实战:从原理到参数调优的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 6:42:49 阅读更多 →
PS5兼容性研究实战:状态识别、工具链匹配与恢复兜底

PS5兼容性研究实战:状态识别、工具链匹配与恢复兜底

我知道很多人看到“AnyPS5”这个名字,第一反应八成是“是不是所有PS5都能折腾了”。但真正在软硬件研究这个圈子里待过一段时间你就明白,“能否折腾”只是结果,背后真正值钱的是兼容性研究那一整套逻辑。不同型号的主板布局不一样&#xff0c…

2026/10/13 6:42:49 阅读更多 →
Windows下PyCharm连接Anaconda:虚拟环境与解释器配置全攻略

Windows下PyCharm连接Anaconda:虚拟环境与解释器配置全攻略

简介:Windows环境下在PyCharm中配置Anaconda开发环境,是不少Python初学者和数据科学入门者常遇到的痛点。这份超详细教程面向上述读者,清晰梳理了Python、PyCharm与Anaconda三者各自的角色与协作关系,并针对安装、导入、包管理过程…

2026/10/13 6:42:49 阅读更多 →
FPGA入门必做:可逆计数器设计详解与上板调试

FPGA入门必做:可逆计数器设计详解与上板调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 6:41:49 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →