ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Jupytext MyST Markdown 格式实战:从 nteract 参数化 Notebook 看代码单元格的 YAML 元数据表示

Jupytext MyST Markdown 格式实战:从 nteract 参数化 Notebook 看代码单元格的 YAML 元数据表示 开发工具【免费下载链接】jupytextJupyter Notebooks as Markdown Documents, Julia, Python or R scripts项目地址https://gitcode.com/gh_mirrors/ju/jupytext点击查看免费下载导读本文以 Jupytext 仓库中的真实转换产物nteract_with_parameter.md由 nteract 生成的参数化 Notebook 转换而来为骨架系统讲解 Jupytext 的MyST Markdownmd:myst文本 Notebook 格式包括 YAML 前言的 Notebook 元数据、{code-cell}指令的冒号简写选项、tags: [parameters]等单元格元数据的双向保留以及源码级的解析与镜像测试机制。读完本文你将能看懂并手写 MyST 格式的 Notebook 文本掌握使用 Jupytext 在.ipynb与.mdMyST 风格之间无损双向转换的方法并理解参数化 NotebookPapermill 风格在纯文本中的落盘形态。MyST MarkdownNotebook 的另一种纯文本载体MySTMarkedly Structured Text是一种在 CommonMark 基础上扩展了 reStructuredText 指令与角色语法的 Markdown 风味。MyST-NB 与 Jupyter Book 正是基于这一语法实现 Notebook 到 Sphinx 文档的直接转换。Jupytext 将md:myst作为一等公民格式纳入自己的格式家族——与普通 Markdown 格式一样代码单元格同样用代码块承载区别在于单元格元数据以 YAML 块的形式写在指令内部详见 formats/markdown.md。在 Jupytext 的源码中MyST 格式由 src/jupytext/myst.py 专门实现CODE_DIRECTIVE {code-cell}与RAW_DIRECTIVE {raw-cell}定义了指令名myst_extensions()声明了该格式允许的扩展名.md、.myst、.mystnb、.mnb。当.md文件同时满足以---开头的 YAML 前言且包含{code-cell}/{raw-cell}指令或前言中声明format_name: myst时Jupytext 即将其判定为 MyST 格式参见matches_mystnb()与测试用例 test_ipynb_to_myst.py。转换产物全貌nteract 参数化 Notebook 的 MyST 表示本文核心样例是 tests/data/notebooks/outputs/ipynb_to_myst/nteract_with_parameter.md——它是从 tests/data/notebooks/inputs/ipynb_py/nteract_with_parameter.ipynb 转换而来的镜像文件。原 Notebook 由 nteract 0.11.6 生成metadata.nteract.version包含 4 个代码单元格其中第一个单元格带parameters标签。转换后的 MyST 文本完整如下--- kernel_info: name: python3 kernelspec: display_name: Python 3 language: python name: python3 --- {code-cell} ipython3 :inputHidden: false :outputHidden: false :tags: [parameters] param 4 {code-cell} ipython3 :inputHidden: false :outputHidden: false import pandas as pd {code-cell} ipython3 :inputHidden: false :outputHidden: false df pd.DataFrame({A: [1, 2], B: [3 param, 4]}, indexpd.Index([x0, x1], namex)) df {code-cell} ipython3 :inputHidden: false :outputHidden: false %matplotlib inline df.plot(kindbar) 这份 41 行的文档虽然短小却浓缩了 MyST 格式的核心规则下面逐一拆解。YAML 前言Notebook 级元数据的落盘文档顶部以---包裹的 YAML 块即front matter前言它保存的是Notebook 级元数据。本例中保留了kernel_info内核名python3与kernelspec显示名、语言、内核名这是文本格式中重建可运行 Notebook 所必需的运行时信息。在源码实现层面myst_to_notebook() 解析时先检查 token 流首元素是否为front_matter再用yaml.safe_load()将其加载为 Notebook 元数据并注入nbf.new_notebook()反向的 notebook_to_myst() 则在nb.metadata非空时通过dump_yaml_blocks(nb_metadata, compactFalse)把元数据写回前言。注意一个细节Notebook 元数据是可选的——若 Notebook 没有任何元数据输出文档会去掉开头的空行直接从单元格开始。此外dump_yaml_blocks()在写单元格元数据时会在无嵌套的纯扁平键值场景下优先采用冒号简写见下文只有出现嵌套结构时才退回--- ... ---的完整 YAML 块。{code-cell}指令代码单元格的标准写法MyST 格式中每个代码单元格都被包裹在一个带{code-cell}指令语言标记的围栏代码块里{code-cell} ipython3 :inputHidden: false :outputHidden: false :tags: [parameters] param 4 语法要素拆解指令头{code-cell}紧跟在}后面的ipython3是可选的语言标记lexer仅用于语法高亮辅助。Jupytext 在往返转换时会从notebook.metadata.language_info.pygments_lexer复制该值若 Notebook 没有pygments_lexer则代码单元格不携带语言标记参见 test_ipynb_to_myst.py 中关于language_info三态参数化的测试。选项区以冒号:开头的行是单元格元数据的简写形式形如:key: value。这是 MyST 指令参数的标准简写语法Jupytext 的dump_yaml_blocks()会尽量使用这种紧凑形式当 YAML 块的所有行都以字母开头即无嵌套时输出为:key: value行否则退回---包裹的完整 YAML。代码体选项区之后、围栏结束之前的部分即为单元格源码。若选项区与代码体之间留有空白行read_fenced_cell()会将其移除因此空行不会进入单元格源码。本样例中每个单元格都带有:inputHidden: false与:outputHidden: false两个选项——它们来自原 Notebook 单元格元数据中的inputHidden/outputHidden键nteract 前端的可见性设置被原样保留下来这正体现了 Jupytext文本与 Notebook 元数据无损同步的设计目标。:tags: [parameters]参数化 Notebook 的元数据标记样例最值得关注的是第一个单元格{code-cell} ipython3 :inputHidden: false :outputHidden: false :tags: [parameters] param 4 这里的:tags: [parameters]对应原 Notebook 单元格元数据中的tags: [parameters]。parameters标签是参数化 Notebook 的通用约定Papermill 等工具通过它识别参数单元格当 notebook 被执行器参数化时param 4这一赋值会被外部注入的配置覆盖从而让同一份 Notebook 在不同参数下批量产出结果。在本样例中第 3 个单元格的B: [3 param, 4]正是消费该参数的地方。Jupytext 的价值在于tags: [parameters]在文本与.ipynb之间往返时被逐字保留且与inputHidden/outputHidden等其它单元格元数据共存于同一指令的 YAML 选项区互不干扰。相比之下仓库测试对 marimo 格式曾明确标注nteract_with_parameter 同时包含 tags 与其它元数据marimo 仅支持 tags而跳过该样本见 tests/conftest.py反衬出 MyST 格式对标签 任意元数据组合的完整支持能力。源码级原理指令解析与元数据回写理解这张文本与 Notebook 的映射关键在 src/jupytext/myst.py 的两条通路文本 → Notebookmyst_to_notebookmarkdown-it 解析器get_parser()开启 table、front_matter、myst_block、myst_role 插件后逐 token 扫描。命中token.info.startswith({code-cell})的围栏 token 时_flush_markdown()先落盘此前累积的 Markdown 单元格read_fenced_cell()调用parse_directive_options()解析选项区——以:开头的行会被剥离冒号后拼成 YAML 块交给yaml.safe_load()得到选项字典nbf_version.new_code_cell(source..., metadata...)用解析出的选项重建 Notebook 单元格并保留token.info中提取的 lexer 作为default_lexer若所有代码单元格语言一致还会写入jupytext.default_lexer元数据。Notebook → 文本notebook_to_myst遍历nb.cells对code/raw类型先写{code-cell}/{raw-cell}指令头围栏分隔符用three_backticks_or_more()保证不与源码中的三反引号冲突随后用dump_yaml_blocks(metadata)输出元数据最后接单元格源码。若单元格源码本身以---或:开头还会额外补一个空行避免与元数据语法混淆。整份样例文档正是这一逻辑对 nteract Notebook 的直接产物。错误防护若前言、指令选项或元数据不是合法 YAML/JSON解析会抛出MystMetadataParsingError参见test_bad_notebook_metadata、test_bad_code_metadata等测试保证文本与 Notebook 的映射严格可控。镜像测试转换稳定性由仓库测试保证nteract_with_parameter.md位于tests/data/notebooks/outputs/ipynb_to_myst/目录是 Jupytext 的镜像文件mirror机制产物仓库用assert_conversion_same_as_mirror()在每次测试时把输入的.ipynb重新转换为 MyST 文本并与该镜像文件逐字符比对确保新版本不会破坏既有输出见 test_mirror.py 中的test_ipynb_to_myst。这意味着你在仓库中看到的这份.md是经过回归测试锁定的稳定输出可直接作为 MyST 书写规范的权威范例。实践如何生成与使用 MyST Notebook 文本在本地复现这份转换产物非常简单仓库是只读的以下命令均在你自己的工作目录中执行命令行转换CLI# 将 .ipynb 转为 MyST Markdown jupytext --to md:myst notebook.ipynb # 将 MyST Markdown 转回 Notebook jupytext --to ipynb notebook.md # 在 Notebook 的 YAML 前言中显式声明 MyST 格式 jupytext --set-formats md:myst notebook.mdPython APIimport jupytext # 读取 Notebook写出 MyST 文本 nb jupytext.read(notebook.ipynb) text jupytext.writes(nb, fmtmd:myst) # 从 MyST 文本读回 Notebook nb2 jupytext.reads(text, fmtmd:myst)配对使用contents manager在 Jupyter 的jupytext.toml配置中把 MyST 设为首选文本格式即可让.ipynb与.myst.md同步更新formats ipynb,md:myst一个更完整的真实案例是 demo/World population.myst.md这份演示 Notebook 的 MyST 表示同时展现了{code-cell}指令、多个连续代码单元格、以及用block break分隔带元数据的 Markdown 单元格的写法与本文样例互补适合作为进阶阅读。补充raw 单元格与 Markdown 单元格在 MyST 中的形态虽然nteract_with_parameter样例只含代码单元格但 MyST 格式对另外两类单元格的规则同样值得了解与本文同源的完整语法见 website/src/content/docs/formats/markdown.mdRaw 单元格使用{raw-cell}指令选项区同样支持冒号简写例如:raw_mimetype: text/htmlMarkdown 单元格默认原样书写、不包裹当单元格带元数据、或紧跟在另一个 Markdown 单元格之后时上方插入块断行block break元数据以单行 JSON 形式跟在后面例如 {slide: true}。在 demo/World population.myst.md 中可以看到分隔相邻 Markdown 单元格的实际效果。需要留意两个使用前提MyST 格式要求Python 3.6且安装markdown-it-py缺失时会抛出带明确提示的ImportError见 test_ipynb_to_myst.py 的test_meaningfull_error_*用例而md:myst与普通md的区分由 Jupytext 依据前言中的format_name: myst或指令存在与否自动判定不必显式声明扩展名。结语nteract_with_parameter.md用不到五十行文本完整承载了一个含参数化标记、单元格可见性元数据与内核信息的 Notebook。透过这份样例与 src/jupytext/myst.py 的源码你可以掌握 MyST 格式的全部核心语法——YAML 前言、{code-cell}指令、冒号简写元数据与tags: [parameters]标签的保留规则并借助 CLI、Python API 或 contents manager 在自己的项目中落地ipynb ⇄ md:myst的无损工作流让 Notebook 真正走进 Git 与文档生态。赞分享开发工具【免费下载链接】jupytextJupyter Notebooks as Markdown Documents, Julia, Python or R scripts项目地址https://gitcode.com/gh_mirrors/ju/jupytext点击查看免费下载相关推荐Jupytext MyST Markdown 格式实战用 md:myst 把 Notebook 变成保留单元格元数据的 Markdown 文档Jupytext MyST Markdown 格式实战用 md:myst 把 Notebook 变成保留单元格元数据的 Markdown 文档 Jupytex开发工具Jupytext MyST Markdown 格式详解从 .ipynb 到 Myst 文档的双向转换与单元格元数据编码Jupytext MyST Markdown 格式详解从 .ipynb 到 Myst 文档的双向转换与单元格元数据编码 本文以 Jupytext 仓库中的真实开发工具Jupytext MyST Markdown 格式实战LaTeX 数学公式、 单元格分隔与 cell_marker 元数据的保留机制Jupytext MyST Markdown 格式实战LaTeX 数学公式、 单元格分隔与 cell_marker 元数据的保留机制 本篇技术指南以开发工具上一篇openEuler/btfhub故障排除手册常见问题与解决方案汇总下一篇openRSO 社区贡献指南如何参与开源项目开发与改进创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表