在ipython-notebook的Markdown单元格中展开变量

Ian*_*Ian 8 ipython-notebook

在ipython-notebook中的markdown单元格中,我希望能够自动扩展变量.可以这样做吗?

例如,请考虑以下代码

from IPython.core.display import HTML
from markdown import markdown

base_url = "https://stackoverflow.com/"
markdown_string = "Two categories at [stackoverflow]({0}) are "\
                  "[ipython-notebook]({0}questions/tagged/ipython-notebook) and "\
                  "[matplotlib]({0}questions/tagged/matplotlib).".format(base_url)
HTML("<p>{}</p>".format(markdown(markdown_string)))
Run Code Online (Sandbox Code Playgroud)

这将产生具有正确链接的输出单元,全部相对于base_url,as

stackoverflow的两个类别是ipython-notebookmatplotlib.

我想要的是能够直接在单元格中键入markdown,引用预定义的变量.这可能吗?

小智 6

虽然它不可能与真正的Markdown单元格相关,但您可以轻松创建魔法以获得相同的效果.

from __future__ import absolute_import
from IPython.core.getipython import get_ipython
from IPython.core.magic import (Magics, magics_class,  cell_magic)

@magics_class
class MarkdownMagics(Magics):

    @cell_magic
    def markdown(self, line, cell):
        from IPython.core.display import HTML
        from markdown import markdown

        vars = line.split()

        d = {}
        for k, v in self.shell.user_ns.items():
            if k in vars:
                d[k] = v

        return HTML("<p>{}</p>".format(markdown(cell.format(**d))))

get_ipython().register_magics(MarkdownMagics)
Run Code Online (Sandbox Code Playgroud)

设置一些变量

foo = 1
bar = 2
Run Code Online (Sandbox Code Playgroud)

然后调用魔法,参数是你想从命名空间中获取的变量.

%%markdown foo bar

Substitute _{foo}_ and *{bar}*
Run Code Online (Sandbox Code Playgroud)


ost*_*ach 5

正如@Jakob在评论中回答的那样,最简单的方法是安装python-markdown IPython笔记本扩展,如维基页面所述.

然后,您可以通过用大括号括起来在markdown中访问变量:

Python单元格:

x = 1000
Run Code Online (Sandbox Code Playgroud)

降价单元格:

Insert variable contents here -> {{x}}.
Run Code Online (Sandbox Code Playgroud)

降价单元格被解析为:

Insert variable contents here -> 1000.
Run Code Online (Sandbox Code Playgroud)