在 jupyter/iPython notebook 脚本和类方法之间同步代码

Posted

技术标签:

【中文标题】在 jupyter/iPython notebook 脚本和类方法之间同步代码【英文标题】:Synchronizing code between jupyter/iPython notebook script and class methods 【发布时间】:2016-12-10 18:28:08 【问题描述】:

我正在尝试找出让 Jupyter/iPython 笔记本中的代码和类方法中的相同代码保持同步的最佳方法。这是用例:

我写了一个长脚本,在笔记本中使用 pandas,并且有多个单元格,这使得开发变得容易,因为我可以在笔记本中检查中间结果。这对于 pandas 脚本非常有用。我将该工作代码下载到 Python“.py”文件中,并将该脚本转换为我程序中 Python 类中的一个方法,该方法使用输入数据进行实例化,并作为该方法的结果提供输出。一切都很好。该 Python 类用于一个更大的应用程序,所以这是真正的可交付成果。

但是随后在方法的实现中出现了某个数据集的错误,这也在我的脚本中。我可以回到我的笔记本上,一步一步地通过各个单元格来查找问题。我解决了这个问题,但随后我必须小心地在常规 Python 类方法代码中进行更改。这有点痛苦。

理想情况下,我希望能够跨单元运行类方法,以便检查中间结果。我不知道该怎么做。

那么保持脚本代码和嵌入在类方法中的代码同步的最佳做法是什么?

是的,我知道我可以将类导入笔记本,但是我无法通过单个单元格查看类方法内部的中间结果,这是我在纯脚本时所做的。对于 pandas,这非常有用。

【问题讨论】:

你能用“jupyter”标记这个吗?这是从 jupyter 项目网站导航时 jupyter 项目链接到的标签。 @Utkonos 我添加了那个标签 【参考方案1】:

我使用了与您相同的开发工作流程,并认识到能够使用 jupyter 笔记本单步执行代码的价值。我已经开发了几个包,首先是对细节进行散列,然后最终将完善的产品移动到单独的 .py 文件中。我认为没有一个简单的解决方案可以解决您遇到的不便(我遇到了同样的问题),但我会描述我的做法(我不会大胆地宣称它是“最佳”做法),也许它将对您的用例有所帮助。

根据我的经验,一旦我从我的 jupyter 笔记本创建了一个模块/包,就更容易在笔记本之外维护/开发代码并将该模块导入笔记本进行测试。

保持每个方法的小规模通常是一种很好的做法,并且对于使用笔记本测试每个步骤的逻辑非常有帮助。您可以将较大的“公共”方法分解为使用前导下划线命名的较小的“私有”方法(例如“_load_file”。您可以在笔记本中调用“私有”方法进行测试/调试,但您模块的用户应该知道忽略这些方法。

您可以使用importlib 模块中的reload 函数通过对源代码所做的更改快速刷新导入的模块。

import mymodule
from importlib import reload
reload(mymodule)

再次调用import 实际上不会更新您的命名空间。您需要 reload 函数(或类似函数)来强制 python 重新编译/执行模块代码。

不可避免地,您仍然需要逐行执行各个函数,但如果您已将代码分解为小方法,则需要在笔记本中“重新编写”的代码量非常少。

【讨论】:

这是个好主意,而且它还建议在笔记本的初始工作流程中,我应该创建许多小方法来执行每个步骤,而不是将其作为一个大脚本.然后我可以更轻松地检查每个方法创建的中间结果,无论是在笔记本外的代码中,还是在笔记本内。

以上是关于在 jupyter/iPython notebook 脚本和类方法之间同步代码的主要内容,如果未能解决你的问题,请参考以下文章

如何将 python3 内核添加到 jupyter (IPython)

window下安装jupyter,ipython的方法

如何在 jupyter/ipython 笔记本中启用 MathJax Upgreek?

在笔记本中组合jupyter / ipython内核

Jupyter (IPython) Notebook 单元格中有多个 Audio 对象

在 jupyter/iPython notebook 脚本和类方法之间同步代码