mvc概念在jupyter中的实现
notebook-restified的Python项目详细描述
简介
这个图书馆及其内部的思想仍在发展中。考虑到这是一个alpha(或者最多是beta)产品,语法可能会改变!我相信这里的想法是可靠的,经得起时间的考验,但实现过程仍在不断变化中。 根据我的经验,许多工作流实现都遵循类似的模式。它们从一个笔记本开始,然后迁移到可以被视为"生产"的东西,可能有也可能没有jupyter/笔记本连接。希望本节能与您在企业组织中使用jupyter的经验产生共鸣。 首先,笔记本作者在"草稿行"风格的笔记本中探索了一个问题空间:查询数据的api、清理和组合数据、回答有关数据的问题。用户输入变量在此阶段在代码单元格中定义。应用程序逻辑是线性的、同步的,并被分解成小的输入/输出单元,以更好地理解过程的每个步骤。笔记本的"结果"没有严格定义。 其次,笔记本作者使用标记单元格和解释性工具(如toc2)来记录工作流。用户输入、应用程序逻辑和笔记本的结果与第一步没有变化。笔记本现在可以供公众使用了,各部分(输入什么、结论是什么、工作流程中的步骤是什么)的布局更加明确。 第三,笔记本作者将笔记本重构为"仪表板"模式(例如voila),这意味着用户不应该看到或与代码交互。这种模式对那些被代码吓倒的客户很有吸引力,对于那些需要经过同行评审/合规性评审,然后变得"不可变"的笔记本也很有吸引力。 在第三步中,用户输入来自ipywidgets表单,而不是在代码单元格中定义。应用程序逻辑被重构为回调函数,而不是线性/同步/内省的。笔记本的结果是交互式的,即使生成结果的代码不是交互式的。 或者,第三步可以是将原始笔记本的应用程序逻辑重构为rest端点。用户输入要么是url参数,要么是post的主体。"用户"(通常是其他程序/服务)肯定看不到代码。笔记本的结果(网络应用?)是非常严格的定义,并且不是交互式的。 最后,当第三步出现问题或者笔记本作者想添加新功能时,他们会从仪表板/rest api实现中"取消重构"回到一个更具交互性/内省性的模式,以便在再次重构之前找出问题所在。 将有更多演示。 要在jupyter服务器上启用 重新定义的笔记本的核心是将笔记本视为mvc意义上的模型。在交互模式下, 请参阅活页夹示例以获得实际演示,但通常 在重新定义的笔记本中,有三个标签用于控制笔记本的执行方式。 启用服务器扩展后,可以将笔记本URL中的 我通常同意乔尔·格鲁斯的观点(在将一个笔记本导入另一个笔记本上的视频,图像)。如果一个函数或类被写在一个笔记本上,导入到另一个笔记本上,并在那里使用,那么这就为我设置了一个红旗。python有一个包和包结构的概念,不需要把可重用的代码放在笔记本而不是包(.py文件)中来解决这个概念。 在将代码重构到包中和在回调函数或web应用程序中执行代码与在回调函数或web应用程序中使用笔记本重新定义的笔记本之间肯定存在一个灰色区域。在我看来,微积分的使用是可读性和可理解性。在某些方面,包更好(更好的版本控制、单元测试、readme/readthedocs)。在其他方面,笔记本会更好(目录扩展、交互性)。 工作流程是特定于任务的,并受益于丰富的关于tradecraft的文档,是notebook\u resterified
是一个库,它将jupyter笔记本视为具有输入参数和返回值的独立函数,适合用作rest端点或其他笔记本中的回调函数。换句话说,Notebook\u restrified
尝试在jupyter框架中实现a模型视图控制器上下文。它利用paperpill来读取和参数化笔记本文件,灵感来自于ipython阻塞背后的一些相同目标。
警告
笔记本电脑生命周期
笔记本重新格式化
尝试在我们使用笔记本的三种常用方式之间穿针引线:交互模式、Widgetized仪表板和作为RestAPI。活页夹演示
安装
重新定义的笔记本
位于pypi上,请使用pip安装它:pipinstallnotebook_restified
/restrified/
端点并将笔记本作为rest端点执行,请使用以下命令启用服务器扩展:jupyterserverextensionenablenotebook_restified--sys-prefix
型号
模型
笔记本与其他Jupyter笔记本没有什么不同:内省、探索、解释。模型
笔记本中不应包含任何widget/gui/用户交互代码,该代码保存在视图
笔记本中,该笔记本可以在仪表板模式下运行。或者,可以将模型
笔记本作为rest端点执行。model
笔记本应具有参数化笔记本的单元格标记(见下文)、定义不应在rest/callback函数模式下执行的单元格以及笔记本的"返回"值。到目前为止,对于模型
执行有两种实现:pythonmodel
和kernelmodel
pythonmodel
在代码单元格上使用exec
和eval
执行笔记本。使用pythonmodel的好处是它与使用它的视图
笔记本在同一个内核中运行,因此
视图
笔记本中的全局变量可以传递到
模型
笔记本。
kernelmodel
通过旋转一个新的jupyter内核并在那里运行代码来执行笔记本。使用kernelmodel
的好处是它与语言无关。模型的语法是:
importnotebook_restifiedmodel=notebook_restified.KernelModel('model.ipynb')params={'x':42,'string':'foo'}result=model.execute(params)
单元格标记
参数
用于使用PaperMill库参数化笔记本电脑。将此标记包含在任何单元格中,在这些单元格中,您可以定义将在execute_notebook(nb_path,params)
中重写的变量,或在/restrified/
终结点中使用url参数重写的变量。skip
用于表示当笔记本重新运行或使用execute_notebook
执行笔记本时不应运行的单元格--信息图、自省详细信息、打印语句等。return
是通过eval
调用从execute_notebook
或restful执行(json编码)最终返回的内容,因此它应该是一个非常简单的单元格,没有if语句、赋值等。重新定义的端点
/restrified/
替换为/restrified/
来将任何笔记本作为rest端点调用。将任何参数作为带有get的url参数或带有post的json编码的主体传入。
关于笔记本呼叫笔记本的思考
重新定义的笔记本
不从一个笔记本导入代码对另一个人来说是可以的,但执行笔记本时却把它当作一个函数。关于重构的思考
notebook\u restified
而不是重构代码的完美候选对象。推荐PyPI第三方库