mvc概念在jupyter中的实现

notebook-restified的Python项目详细描述


简介

notebook\u resterified是一个库,它将jupyter笔记本视为具有输入参数返回值的独立函数,适合用作rest端点或其他笔记本中的回调函数。换句话说,Notebook\u restrified尝试在jupyter框架中实现a模型视图控制器上下文。它利用paperpill来读取和参数化笔记本文件,灵感来自于ipython阻塞背后的一些相同目标。

警告

这个图书馆及其内部的思想仍在发展中。考虑到这是一个alpha(或者最多是beta)产品,语法可能会改变!我相信这里的想法是可靠的,经得起时间的考验,但实现过程仍在不断变化中。

笔记本电脑生命周期

根据我的经验,许多工作流实现都遵循类似的模式。它们从一个笔记本开始,然后迁移到可以被视为"生产"的东西,可能有也可能没有jupyter/笔记本连接。希望本节能与您在企业组织中使用jupyter的经验产生共鸣。

首先,笔记本作者在"草稿行"风格的笔记本中探索了一个问题空间:查询数据的api、清理和组合数据、回答有关数据的问题。用户输入变量在此阶段在代码单元格中定义。应用程序逻辑是线性的、同步的,并被分解成小的输入/输出单元,以更好地理解过程的每个步骤。笔记本的"结果"没有严格定义。

其次,笔记本作者使用标记单元格和解释性工具(如toc2)来记录工作流。用户输入、应用程序逻辑和笔记本的结果与第一步没有变化。笔记本现在可以供公众使用了,各部分(输入什么、结论是什么、工作流程中的步骤是什么)的布局更加明确。

第三,笔记本作者将笔记本重构为"仪表板"模式(例如voila),这意味着用户不应该看到或与代码交互。这种模式对那些被代码吓倒的客户很有吸引力,对于那些需要经过同行评审/合规性评审,然后变得"不可变"的笔记本也很有吸引力。

在第三步中,用户输入来自ipywidgets表单,而不是在代码单元格中定义。应用程序逻辑被重构为回调函数,而不是线性/同步/内省的。笔记本的结果是交互式的,即使生成结果的代码不是交互式的。

或者,第三步可以是将原始笔记本的应用程序逻辑重构为rest端点。用户输入要么是url参数,要么是post的主体。"用户"(通常是其他程序/服务)肯定看不到代码。笔记本的结果(网络应用?)是非常严格的定义,并且不是交互式的。

最后,当第三步出现问题或者笔记本作者想添加新功能时,他们会从仪表板/rest api实现中"取消重构"回到一个更具交互性/内省性的模式,以便在再次重构之前找出问题所在。

笔记本重新格式化尝试在我们使用笔记本的三种常用方式之间穿针引线:交互模式、Widgetized仪表板和作为RestAPI。

活页夹演示

binder

将有更多演示。

安装

重新定义的笔记本位于pypi上,请使用pip安装它:

pipinstallnotebook_restified

要在jupyter服务器上启用/restrified/端点并将笔记本作为rest端点执行,请使用以下命令启用服务器扩展:

jupyterserverextensionenablenotebook_restified--sys-prefix

型号

重新定义的笔记本的核心是将笔记本视为mvc意义上的模型。在交互模式下,模型笔记本与其他Jupyter笔记本没有什么不同:内省、探索、解释。模型笔记本中不应包含任何widget/gui/用户交互代码,该代码保存在视图笔记本中,该笔记本可以在仪表板模式下运行。或者,可以将模型笔记本作为rest端点执行。

model笔记本应具有参数化笔记本的单元格标记(见下文)、定义不应在rest/callback函数模式下执行的单元格以及笔记本的"返回"值。到目前为止,对于模型执行有两种实现:pythonmodelkernelmodel

pythonmodel在代码单元格上使用execeval执行笔记本。使用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语句、赋值等。

重新定义的端点

启用服务器扩展后,可以将笔记本URL中的/restrified/替换为/restrified/来将任何笔记本作为rest端点调用。将任何参数作为带有get的url参数或带有post的json编码的主体传入。

关于笔记本呼叫笔记本的思考

我通常同意乔尔·格鲁斯的观点(将一个笔记本导入另一个笔记本上的视频图像)。如果一个函数或类被写在一个笔记本上,导入到另一个笔记本上,并在那里使用,那么这就为我设置了一个红旗。python有一个包和包结构的概念,不需要把可重用的代码放在笔记本而不是包(.py文件)中来解决这个概念。重新定义的笔记本不从一个笔记本导入代码对另一个人来说是可以的,但执行笔记本时却把它当作一个函数。

关于重构的思考

在将代码重构到包中和在回调函数或web应用程序中执行代码与在回调函数或web应用程序中使用笔记本重新定义的笔记本之间肯定存在一个灰色区域。在我看来,微积分的使用是可读性和可理解性。在某些方面,包更好(更好的版本控制、单元测试、readme/readthedocs)。在其他方面,笔记本会更好(目录扩展、交互性)。

工作流程是特定于任务的,并受益于丰富的关于tradecraft的文档,是notebook\u restified而不是重构代码的完美候选对象。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我在尝试进行构造函数链接时不断遇到“错误:找不到符号”   java Powermock构造函数模拟对实例化对象没有影响   Spring测试中未加载java配置属性   java如何强制关闭来自另一个线程的JDBC连接?   java log4j2无法写入文件   参数[frmStartupGame]的java非法修饰符;只允许决赛   java如何在同一页pdfbox上创建多个表?   if语句如何检查此if条件?JAVA   java JNI教程,无法加载库   java Hibernate没有这样的过滤器配置错误   在安卓 mobile中从JSON获取数据的java提供了fatalexception的主要功能   断言上的java“类型不匹配:无法从void转换为boolean”   java Shiro、哈希、盐、数据库   多线程多线程在java中使用相同的连接读取数据库中的同一个表?   Java动态获取集方法