Ipython: 允许在 Markdown 单元格中引用 Python 变量

创建于 2013-02-20  ·  49评论  ·  资料来源: ipython/ipython

在 PR #2592 中, @Carreau提出了在 Markdown 单元格中引用 Python 变量的语法。 它使用 Jinja 风格的{{x}}语法。 我们喜欢这个想法,但有一些事情需要解决:

  • [ ] 我们使用什么语法? 我们对{{}}满意
  • [ ] 我们如何确保我们以稳健而理智的方式处理 Markdown 以处理乳胶和文学作品。 我们正在慢慢远离纯 Markdown,这真的很危险。 我们希望 notebook 格式能够广泛地工作,而拥有我们自己的 Markdown 语法似乎是个坏主意。
  • [ ] 如何处理错误,即未定义的变量。
  • [ ] 我们想对其他显示格式做什么。 开始允许非文本格式似乎是一条危险的道路。
closed-pr notebook

最有用的评论

我认为这个功能对于来自 Rmarkdown 的人来说非常重要。 R 在创建漂亮的报告方面做得更好。

所有49条评论

所以,这是死了吗? 正如前面的线程所指出的那样会很棒吗? 对不起,我希望我有技能来实现(我没有),但我肯定会使用......

没死,只需要先完成几件事。

我刚刚在 SO 上询问这里这里的双重副本。

我的 2c 就是这样

  • Jinja 语法会很棒
  • 这似乎从一个快看那个降价并没有真正有一个“纯粹的” ,但如果从一个完善的实现所有的格式约定(:octocat:github上会是一个很好的一个)随访然后加入注射方法不实际上是降价问题。
  • 错误可能是用户可配置的东西吗? [invisible(什么都没有发生),单词error或脏的大堆栈跟踪] 的选项
  • 只要它是一个文本响应,那么它就可以在传递给降价渲染器之前被注入,因此它可以注入 html 甚至更多的降价!

不提倡任何特定的语法(我认为 {{}} 很好),但这里是 R 的类似设计: http :

Lunamark 使用

:+1:

:+1:,这将是一个非常有用的功能!

拥有与http://blog.rstudio.org/2014/06/18/r-markdown-v2/相同的语法会非常好

我不知道,使用 R 样式的分隔符,即分别是单反引号和三反引号,似乎我们无法在仅显示代码(如some code snippet/example )和 _evaluating_ 代码并显示结果之间进行选择(例如my_var ) - 我认为这不是很实用(如果我理解正确的话)。

用例是编写带有嵌入式计算值的笔记本散文,例如“_摩根县 2014 年的平均失业率为 8.4%,低于 2009 年的 10.3%。_”在此示例中,您可以想象从数据。

更广泛的用例是“智能文档”,您可以从数据中自动(重新)生成(可能隐藏代码以提高可读性)的文本和图形。

我认为这是一个有用的功能。

我真的很喜欢 rstudio 中的“knitr”模型(一个降价文档,代码块被解释,值在降价中可用 -> 转换为 PDF/html/...我可以作为期刊文章发表。与笔记本不同因为笔记本基于多个单元格,我不确定如何影响是否显示输出)。

我不介意这些值是如何包含在文本中的,但是如果 R(带有 knitr/rstudio)和 ipython 都使用相同的值,我会觉得很好。

或者类似于 ruby​​ 或 bash 的东西,其中 #{varname or statement} 可以是
混合在字符串中。

  1. juni 2014 20:27 skrev“Jan Schulz”通知@github.com følgende:

我真的很喜欢rstudio中的“knitr”模型(一个markdown文档,代码
块被解释,值在降价中可用 - >被转换
转换为 PDF/html/...,我可以将其作为期刊文章发表。 不同于一个
笔记本,因为笔记本基于多个单元格,我不知道如何
影响是否显示输出)。

我不介意这些值是如何包含在文本中的,但我会找到它
如果 R (with knitr/rstudio) 和 ipython 都使用相同的,那就太好了。


直接回复此邮件或在 GitHub 上查看
https://github.com/ipython/ipython/issues/2958#issuecomment -46875435。

我知道的当然是解释代码的使用情况下,我只是担心我们会失去降价的能力,“只是”显示代码(不解释/评测吧), like this ,如果R语法(即反引号) 被选中。

我认为在 knitr/R markdown 中,您可以指示是要显示代码(正确高亮等)还是仅显示输出(图、表格等)。

我来自经济学背景,我不想在我的论文中看到任何代码,所以这与(在我看来)展示代码的优化用例有点不同。

@bilderbuchi哦,抱歉,我误解了您“认为这没有用”评论的上下文。

我同意:实施的任何内容都不应破坏现有的降价。

这会很棒,让 IPython 吃掉 knitr 的午餐。

https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/python-markdown

我真的很喜欢这种方法:它需要一个单元格并将其预处理为有效的降价,因此不需要对降价处理器进行更改。

非常好...很快就会使用

2014 年 8 月 17 日星期日下午 2:18,Jan Schulz通知@github.com
写道:

https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/python-markdown


直接回复此邮件或在 GitHub 上查看
https://github.com/ipython/ipython/issues/2958#issuecomment -52431760。

汤姆布兰德
http://tombrander.com -房地产
http://oswco.com -开放软件
西杰克逊大道 3763 号
伯明翰,AL 35213
电话 205-267-1089
@dartdog

:+1:优雅。 我也会用。

@JanSchulz ,谢谢! 我真的很期待尝试 python-markdown。

有没有机会把它放到主 ipython ( jupyter ) 中?

有没有机会把它放到主 ipython (jupyter) 中?

可能不会很快。 我们需要在后台做很多设计才能让它发挥作用。
尤其是我们需要一种官方的方式来扩展 Markdown 语法,而不是仅仅发明一种新的语法。

实际上,这(还有 knitr/rmarkdown AFAIK)通过两阶段转换来工作:首先用代码的输出替换任何代码块,然后将其余的转换为标准降价。 所以这不是 markdown 的扩展,而是单元格的预处理器。

我认为难题是如何处理从 Markdown 单元格中执行的任意不可见 Python 代码。 我认为在有用的实现中不会限制代码的执行。

只要它是一个单独的扩展,您必须主动安装和激活,这是另一回事。 此外,Python 代码仅在笔记本受信任时才会执行。

如果您将鼠标悬停在 markdown 单元格中的 python 代码输出上,我计划添加一个显示源代码的工具提示,以便您可以看到它的来源。

实际上,这(还有 knitr/rmarkdown AFAIK)通过两阶段转换来工作:首先用代码的输出替换任何代码块,然后将其余的转换为标准降价。 所以这不是 markdown 的扩展,而是单元格的预处理器。

这是自定义降价。 这已经是我们使用 mathjax 所拥有的。 我们显然必须存储
如果您重新运行笔记本,请取消预处理降价,因此任何想要使用我们降价的工具都必须处理自定义预处理。
前处理器或后处理器,我们发明了我们自己的语法,这可能会或可能不会与人们想要做的事情或以后会做的事情发生冲突。

我认为难题是如何处理从 Markdown 单元格中执行的任意不可见 Python 代码。 我认为在有用的实现中不会限制代码的执行。

只要它是一个单独的扩展,您必须主动安装和激活,这是另一回事。 此外,Python 代码仅在笔记本受信任时才会执行。

如果您将鼠标悬停在 markdown 单元格中的 python 代码输出上,我计划添加一个显示源代码的工具提示,以便您可以看到它的来源。

如果我们这样做,我们可以约束到 user_variable,即返回user_ns键的值。 这应该会阻止大多数执行。

如果我们这样做,我们可以约束到 user_variable,即返回 user_ns 键的值。 这应该会阻止大多数执行。

您还需要允许调用函数。 一个微不足道的情况是格式化输出或调用自定义 _repr_。

我很想看到这样的东西实现。 看起来最直接的解决方案是通过 Jinja 过滤器运行 MD 单元。 这是以前做过的。 例如,请参阅dexi

另一方面,我不认为这应该在所有单元格中默认启用。 Jinja 会显着增加标记的复杂性,并且 Jinja+Markdown 可能应该使用与普通 MD 不同的突出显示模式。 为什么不将其实现为单独的单元格类型?

我认为这个问题可能会消失,如果有可能从代码中隐藏/替换类似于当前为降价所做的代码单元格:

-> 添加%%pymarkdown魔法,它输出text/markdown消息并指示源应该不可见/由输出替换。 然后魔术会在输入中简单地做一个 s&r 。

[编辑:好的,它有不同的问题,比如没有语法高亮和在 qtconsole 中没有意义......]

相关:Mathematica 10 添加了对“报告”的支持,参见: http :

我还没有(还)详细地玩过它,但看起来你可以使用 notebook 作为模板,在 notebook 文本中嵌入对变量和计算输出的引用。

假设我们在多个 MD 单元格中有对同一个变量的多个引用。 更改其值时应再次呈现哪些单元格?

@Pipeliner我不确定你在说什么。 在 iPython/Jupyter 笔记本中,每个单元格都必须显式呈现(通过单元格内的 Ctrl-return 或菜单栏中的 Cell->Run All)。 没有自动检测我所知道的陈旧数据。 你在考虑 knitr/rmarkdown 吗? knitr/rmarkdown 确实尝试维护每个单元格的结果缓存,并在较早的单元格更改时将它们标记为脏。

人们正在使用这个问题有什么解决方法吗? 我喜欢 ipython/jupyter 笔记本,但如果我们可以在 Markdown 中执行 {{ python variable }} 那就太棒了。 如果你正在准备一个带有小样本数据集的笔记本,然后你想要交换完整的数据集并更新所有内容,它会非常方便

您可以使用 PlaceProxy 小部件在页面上的任何 html 选择器处呈现小部件。 在你的降价中,嵌入一个<span id="myid">placeholder</span> ,然后在你的代码中,使用类似x=HTML('widget value'), PlaceProxy(child=x, selector='#myid') 。 然后,每当您设置x.value='something' ,更新都会反映在降价中显示的小部件中。 PlaceProxy 的定义见https://github.com/ipython/ipywidgets/blob/1e407cef864363c66a23781b8d560a6ac18b3370/ipywidgets/widgets/widget_box.py#L70

当然,有很多警告。 如果您编辑降价,小部件就会消失。 如果您打开笔记本,小部件可能尚未创建,因此不会显示等。但它确实让您可以通过编程方式控制降价单元格内的输出。

另一种选择是构造字符串并将降价显示为输出,而不是降价单元格。 它不会动态更新,但每次您评估单元格时,降价都会更新。

我不想构造字符串并把它作为输出,因为它有大的 html 字符串会变得如此混乱 - 不过这个主意很好,我什至没有想到这一点。 但是肯定有几个很好的解决方案可以解决问题 - 谢谢!

我认为这个功能对于来自 Rmarkdown 的人来说非常重要。 R 在创建漂亮的报告方面做得更好。

我在笔记本中看到了这个问题的副本。 这已经可以在代码单元中使用IPython.display.Markdown

image

from IPython.display import Markdown

one = 1
two = 2
three = one + two

Markdown("# Title")
Markdown("""
# Math
## Addition
Here is a simple addition example: {one} + {two} = {three}
""".format(one=one, two=two, three=three))

好的! 编写实用程序(甚至是 %%markdown 魔法)也很容易
自动从内核命名空间中提取变量,所以你可以
做:

%%markdown

## Subsection

Here is {one} and {two}

2017 年 4 月 26 日星期三下午 6:35,Grant Nestor通知@github.com
写道:

我在笔记本中看到了这个问题的副本。 这已经是可能的
在代码单元中使用 IPython.display.Markdown:

[图像:图像]
https://cloud.githubusercontent.com/assets/512354/25464012/f434c52c-2aae-11e7-9171-541fb0f6601e.png

从 IPython.display 导入 Markdown

一 = 1
二 = 2
三 = 一 + 二

Markdown("#标题")
Markdown("""#Math## Addition这里是一个简单的加法例子:{one} + {two} = {three}""".format(one=one, two=two,three=three))


你收到这个是因为你被分配了。
直接回复本邮件,在GitHub上查看
https://github.com/ipython/ipython/issues/2958#issuecomment-297586914
或静音线程
https://github.com/notifications/unsubscribe-auth/AABr0CIHhxwNwQF6MiHHy2M612zRnf5Wks5rz_D4gaJpZM4AchzX
.

——
布赖恩·E·格兰杰
物理与数据科学副教授
加州保利州立大学,圣路易斯奥比斯波
@ellisonbg在 Twitter 和 GitHub 上
[email protected][email protected]

@ellisonbg那会很好,我认为这是正确的方法(从 Python 渲染 Markdown 与以不应该扩展的方式扩展标记和其他降价机制)。 @Carreau对这样的事情感兴趣吗?

此外,将此与笔记本中的新单元格标签功能相结合(请参阅笔记本 5.0 发布帖子),您应该能够在使用 nbconvert 转换笔记本时隐藏输入单元格(例如使用nbconvert-hide标签)。 @takluyver nbconvert-hide标签当前是否与 nbconvert 一起使用?

我认为还没有,但我认为我们应该添加一些 nbconvert 标签。

+1 对这一切! 此外,我们目前正在努力将输入/输出隐藏在
JupyterLab 并将能够将该状态保存到 nbconvert
元数据。

2017 年 4 月 27 日星期四上午 7:33,Grant Nestor通知@github.com
写道:

@ellisonbg https://github.com/ellisonbg那会很好,我认为
这是正确的方法(从 Python vs. 渲染降价)
以可能的方式扩展标记和其他降价机制
不应延长)。 @Carreau https://github.com/Carreau任何
对这样的事情感兴趣?

此外,将此与笔记本中的新单元格标签功能相结合
(请参阅 notebook 5.0 发布帖
http://blog.jupyter.org/2017/04/04/jupyter-notebook-5-0/ ),你应该
使用 nbconvert 转换笔记本时能够隐藏输入单元格
(例如使用 nbconvert-hide 标签)。 @takluyver https://github.com/takluyver
nbconvert-hide 标签当前是否与 nbconvert 一起使用?


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/ipython/ipython/issues/2958#issuecomment-297731409
或静音线程
https://github.com/notifications/unsubscribe-auth/AABr0BNgLTtlzwbrIjqBquzsE9lhLXchks5r0KdAgaJpZM4AchzX
.

——
布赖恩·E·格兰杰
物理与数据科学副教授
加州保利州立大学,圣路易斯奥比斯波
@ellisonbg在 Twitter 和 GitHub 上
[email protected][email protected]

@Carreau对这样的事情感兴趣吗?

这种做事方式已经在 2013 年讨论过,AFAICT 不赞成:

  • 您需要在每种语言中重新实现 %%markdown
  • 它需要在内核端计算才能显示文本
  • 它改变了呈现降价的语义。
  • 搞砸了 nbconvert --to markdown和 nbconvert --to script
  • 搞砸笔记本进口挂钩。

这打破了笔记本(恕我直言)的语义,因为然后“降价”单元格的文本取决于内核状态。 所以虽然它很可爱,但我要反对这个想法。

还有%%markdown%%latex%%javascript ... 等魔法是在我们讨论的时候写的。

我会注意到,类似的魔法已经存在了很长一段时间,并且有比仅使用%%markdown更高级的功能,所以请不要着急,因为您已经退出了,因为您以前从未遇到过这个想法。

我的想法随着时间的推移而发展,我喜欢@gnestor的想法。

根据定义,如果用户想要在 markdown 单元格中来自内核的变量,
该降价单元将取决于内核。 说“这打破了
笔记本的语义”就像说我们不应该允许代码单元
因为它们在内核上运行并返回输出。 主要目的之一
notebook 文档的目的是记录内核所做的事情。
在任何支持丰富输出的内核上的实现都是微不足道的
这会破坏下游的任何东西(nbconvert,导入钩子)然后是那些东西
有错误(降价输出已经是一回事)。

但是我在 ipython 内核之外做这件事很好......

2017 年 4 月 27 日星期四上午 10:29,Matthias Bussonnier <
[email protected]> 写道:

@Carreau https://github.com/Carreau对这样的事情感兴趣吗?

这种做事方式早在 2013 年就已经讨论过了
AFAICT 被认为是:

  • 您需要在每种语言中重新实现 %%markdown
  • 它需要在内核端计算才能显示文本
  • 它改变了呈现降价的语义。
  • 搞砸了 nbconvert --to markdown 和 nbconvert --to 脚本
  • 搞砸笔记本进口挂钩。

这打破了笔记本的语义(恕我直言),因为然后文本
“降价”单元取决于内核状态。 所以虽然它很可爱,但我要去
反对这个想法。

还有 %%markdown, %%latex, %%javascript ... 等魔法写在
我们讨论这个问题的时候。

我会注意到类似的魔法已经存在了很长一段时间
https://gist.github.com/bj0/5343292以及比
只是使用 %%markdown,所以请不要着急,因为你已经退出了
你以前从未遇到过这个想法。


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/ipython/ipython/issues/2958#issuecomment-297784026
或静音线程
https://github.com/notifications/unsubscribe-auth/AABr0HU-Gb3ENSidykbte53geYqPpy-sks5r0NCAgaJpZM4AchzX
.

——
布赖恩·E·格兰杰
物理与数据科学副教授
加州保利州立大学,圣路易斯奥比斯波
@ellisonbg在 Twitter 和 GitHub 上
[email protected][email protected]

参考实现(经典笔记本扩展): https :

我认为这是正确的方法(从 Python 渲染降价

只是澄清一下,因为我最初读错了您的陈述 - 这是使用内核显示降价(作为降价 mimetype),而不是降价

我喜欢这种方法。 如果您想要涉及内核状态的简单降价,那么使用内核来显示该降价。 如果您希望 Markdown 实时更新,请使用小部件(您可以使用 OutputWidget,或者我们可以制作一个类似于 HTMLWidget 的 MarkdownWidget)。 这伴随着隐藏/显示输入和输出的简单方法,对我来说很有意义。

刚刚看到这张票,想提一下, SoS也采用了上述方法,即从内核渲染降价。 基本上,sos 实现了一个%render魔法,它在 MD(默认情况下)、HTML 等中呈现单元格的标准输出,并且因为 sos 支持不同的语言,它还呈现来自它启动的任何子内核的输出。

这是一个简单的修复: https :

如果发生的任何事情也可以与 RMarkdown 兼容,那就太好了。 那使用

 x 的值是`rx`。

x是 R 中的一个变量。

https://github.com/vatlab/markdown-kernel不一定是您需要的,但它支持 Jupyter 环境中的 Rmarkdown 单元。

TL; DR:这个线程仍然是最新的吗? JupyterLab 没有直接的解决方案,但 Notebook 有? (2020)

所以......阅读这个帖子,并尝试各种建议的黑客......似乎到 2020 年,这个功能在 JupyterLab 中仍然是不可能的/缺失的(主要网站多年来一直在推动人们使用它?),除非您使用 SoS(所有其他解决方法似乎要么仅限笔记本,即对于现代安装来说是遗留的/无用的......或者需要丢弃使用 Jupyter 的“代码 + 降价”核心功能的大部分便利)。

有什么我错过了吗? 似乎主要的 JupyterLab(注意:不是 Notebooks,它工作得很好,当 Notebooks 显然工作得更好,即使在 2020 年,我觉得主要项目如此努力地推动 Lab 如此努力)基本上不支持降价除了琐碎的、非分析的、示例之外的任何内容的文档 - 从修辞上讲:如果您无法使用格式输出数据,那么在数据分析产品中包含格式系统有什么意义?

这似乎是错误的,我想我一定错过了一些基本的东西。 “SoS + markdown-kernel”感觉就像一把大锤敲碎核桃,但既然它有效......

此页面是否有帮助?
0 / 5 - 0 等级