我正在试图找出将代码保存在Jupyter / iPython笔记本中的最佳方法,以及同步中类方法中的相同代码。这是用例:
我写了一个在笔记本中使用pandas的长脚本,并且有多个单元格使开发变得容易,因为我可以检查笔记本中的中间结果。这对于pandas脚本非常有用。我将该工作代码下载到Python“.py”文件中,并将该脚本转换为程序中Python类中的方法,该方法使用输入数据进行实例化,并根据该方法提供输出。一切都很好。 Python类在更大的应用程序中使用,因此这是真正的可交付成果。
但是在该方法的实现中存在某个数据集的错误,这也存在于我的脚本中。我可以回到我的笔记本上,逐步浏览各种细胞以找到问题。我解决了这个问题,但后来我必须在常规的Python类方法代码中仔细进行更改。这有点痛苦。
理想情况下,我希望能够跨单元格运行类方法,因此我可以检查中间结果。我无法弄清楚如何做到这一点。
那么保持脚本代码和嵌入在类方法中的代码同步的最佳做法是什么?
是的,我知道我可以将类导入到笔记本中,但是我失去了通过单个单元格查看类方法中的中间结果的能力,这是我在纯脚本时所做的。使用pandas,这非常有用。
答案 0 :(得分:5)
我使用了相同的开发工作流程,并认识到能够使用jupyter笔记本逐步执行代码的价值。我通过首先挖掘细节然后最终将抛光的产品移动到单独的.py文件中来开发了几个软件包。我不认为有一个简单的解决方案可以解决您遇到的不便(我遇到了同样的问题),但我会描述我的做法(我不是那么大胆地宣称它是"最好的&# 34;练习)也许它会对你的用例有所帮助。
根据我的经验,一旦我从jupyter笔记本创建了一个模块/包,就可以更容易地在笔记本之外维护/开发代码并将该模块导入笔记本进行测试。
保持每个方法都很小是一般的好习惯,并且非常有助于使用笔记本在每个步骤测试逻辑。你可以打破更大的公共"方法变成较小的私人"使用前导下划线命名的方法(例如' _load_file'。您可以在笔记本中调用" private"方法进行测试/调试,但模块的用户应该知道忽略这些方法。
您可以使用reload
模块中的importlib
功能快速刷新导入的模块,并对源进行更改。
import mymodule
from importlib import reload
reload(mymodule)
再次调用import
实际上不会更新您的命名空间。您需要reload
函数(或类似函数)来强制python重新编译/执行模块代码。
不可避免地,您仍然需要逐行逐步执行各个功能,但如果您已将代码分解为小方法,那么您需要重新编写代码的数量"在笔记本电脑中非常小。