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



我正在努力找出保持Jupyter/iPyson笔记本中代码和类方法中相同代码同步的最佳方法。这是一个用例:

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

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

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

那么,保持脚本代码和嵌入类方法中的代码同步的最佳实践是什么呢?

是的,我知道我可以将类导入到笔记本中,但随后我就失去了通过单个单元格查看类方法内部中间结果的能力,这就是我在纯脚本中所做的。对于熊猫来说,这是非常有用的。

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

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

一般来说,保持每种方法都很小是一种很好的做法,对于使用笔记本测试每一步的逻辑非常有帮助。您可以将较大的"public"方法拆分为较小的"private"方法,这些方法使用前导下划线命名(例如"_load_file")。您可以调用笔记本中的"private"方法进行测试/调试,但模块的用户应该知道忽略这些方法。

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

import mymodule
from importlib import reload
reload(mymodule)

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

不可避免的是,您仍然需要逐行遍历各个函数,但如果您将代码分解为小方法,则需要在笔记本中"重写"的代码量非常少。

最新更新