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

Irv*_*Irv 4 python pandas ipython-notebook jupyter jupyter-notebook

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

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

但是在该方法的实现中存在某个数据集的错误,这也存在于我的脚本中.我可以回到我的笔记本上,逐步浏览各种细胞以找到问题.我解决了这个问题,但后来我必须在常规的Python类方法代码中仔细进行更改.这有点痛苦.

理想情况下,我希望能够跨单元格运行类方法,因此我可以检查中间结果.我无法弄清楚如何做到这一点.

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

是的,我知道我可以将类导入到笔记本中,但是我失去了通过单个单元格查看类方法中的中间结果的能力,这是我在纯脚本时所做的.使用pandas,这非常有用.

Gor*_*ean 5

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

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

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

您可以使用模块中的reload功能importlib通过对源进行的更改来快速刷新导入的模块.

import mymodule
from importlib import reload
reload(mymodule)
Run Code Online (Sandbox Code Playgroud)

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

不可避免地,您仍然需要逐行逐步执行单个函数,但如果您将代码分解为小方法,那么在笔记本中"重写"所需的代码量非常小.