我正在尝试找出使 Jupyter/iPython notebook 中的代码与类方法中的相同代码保持同步的最佳方法。这是用例:
我在笔记本中使用 pandas 编写了一个长脚本,并且有多个单元格,这使得开发变得容易,因为我可以在笔记本中检查中间结果。这对于 pandas 脚本非常有用。我将该工作代码下载到一个 Python“.py”文件中,并将该脚本转换为我程序中 Python 类中的一个方法,该方法使用输入数据进行实例化,并提供输出作为该方法的结果。一切都很好。该 Python 类用于更大的应用程序,因此这是真正的交付物。
但是后来在方法的实现中出现了某个数据集的错误,我的脚本中也有错误。我可以回到我的笔记本,一步一步地通过各个单元格来找到问题。我解决了这个问题,但我必须小心地在常规 Python 类方法代码中进行更改。这有点痛苦。
理想情况下,我希望能够跨单元格运行类方法,这样我就可以检查中间结果。我不知道该怎么做。
那么保持脚本代码和嵌入类方法的代码同步的最佳实践是什么?
是的,我知道我可以将类导入到笔记本中,但是我无法通过单个单元格查看类方法内部的中间结果,这是我在纯脚本时所做的。对于 pandas,这非常有用。
最佳答案
我使用过与您相同的开发工作流程,并认识到能够使用 jupyter notebook 单步执行代码的值(value)。我开发了几个包,首先散列细节,然后最终将完善的产品移动到单独的 .py 文件中。我不认为有一个简单的解决方案可以解决您遇到的不便(我遇到了同样的问题),但我会描述我的做法(我没有那么大胆地宣称它是“最佳”做法)也许它将对您的用例有所帮助。
根据我的经验,一旦我从我的 jupyter notebook 创建了一个模块/包,就可以更轻松地在 notebook 外部维护/开发代码并将该模块导入 notebook 进行测试。
通常,保持每个方法较小是一种很好的做法,并且对于使用笔记本测试每一步的逻辑非常有帮助。您可以将较大的“公共(public)”方法分解为使用前导下划线(例如“_load_file”)命名的较小“私有(private)”方法。您可以在笔记本中调用“私有(private)”方法进行测试/调试,但模块的用户应该知道忽略这些方法。
您可以使用 importlib
模块中的 reload
函数来使用对源代码所做的更改快速刷新导入的模块。
import mymodule
from importlib import reload
reload(mymodule)
再次调用 import
实际上不会更新您的 namespace 。您需要 reload
函数(或类似函数)来强制 python 重新编译/执行模块代码。
不可避免地,您仍然需要逐行执行各个函数,但如果您已将代码分解为小方法,则需要在笔记本中“重写”的代码量非常少。
关于python - 在 jupyter/iPython notebook 脚本和类方法之间同步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38770604/