代码之家  ›  专栏  ›  技术社区  ›  krismath maasg

如何遵循jupyter python笔记本中的DRY原则

  •  2
  • krismath maasg  · 技术社区  · 6 年前

    Jupyter 是一个笔记本,一个人们可以用多种语言编写文档和执行代码的web应用程序。为了解决这个问题,让我们只使用python。

    我经常发现自己在许多jupyter文件中复制代码,主要是在数据科学项目的预测模型中的评估代码。我怎么能不在jupyter python笔记本上重复我自己呢?

    1 回复  |  直到 6 年前
        1
  •  3
  •   gilch    6 年前

    创建一个带有公共代码的模块,并将其导入到需要它的笔记本中。Jupyter可以将Python笔记本导出为Python模块。文件>下载为>Python(.py)。

    将该文件放在内核的路径上,然后可以导入它。

    使用Python内核,您可以看到

    import sys
    sys.path
    

    如果将模块放在这些目录中的任何一个目录中,都可以导入它。也可以附加新的路径字符串,可以使用 sys.path.append(...) (仅用于该会话)或通过更新或操作系统中的相关环境变量(通常 PYTHONPATH ).


    可以导入一个.ipynb,但它不如先转换它那么简单。IPython单元格可以使用扩展语法,如“-magics”等。IPython包含以编程方式加载.ipynb文件所需的所有工具(请参见 nbformat.read() IPython.core.interactiveshell.InteractiveShell ),那么这只是使用标准库导入挂钩的问题。

    这有点太复杂了,不能在这里复制,但是 Jupyter documentation explains how to do it.


    有没有办法只从另一个笔记本导入某些单元格?我好像找不到。

    是的,应该可以导入单个单元格,但请注意,如果单元格假定您未导入的单元格已运行,则该单元格可能无法正常工作。

    链接文档中的相关片段是

         for cell in nb.cells:
            if cell.cell_type == 'code':
                # transform the input to executable Python
                code = self.shell.input_transformer_manager.transform_cell(cell.source)
                # run the code in themodule
                exec(code, mod.__dict__)
    

    注意这是如何使用循环依次运行每个代码类型单元的。你可以在这里运行一个或多个特定的单元格,而不是所有的单元格。然后导入的模块将只运行该代码。

    棘手的部分可能是识别你想要的细胞。最明显的方法是计数,但是你也可以以某种方式标记单元格,例如在循环中,只有在 cell.source 从某个评论或其他东西开始。