Skip to main content

用于阻止 Jupyter 笔记本中的单元执行的上下文管理器

项目描述

ipython_blocking

粘合剂

ipython_blocking是一个上下文管理器,用于在 Jupyter 笔记本中捕获单元执行消息,以及魔术命令%block%blockrun方便。阻止笔记本执行的主要用例是等待用户与ipywidget交互,然后引用在这些小部件中输入的值。

安装

ipython_blockingPyPI上,使用 pip 安装。

pip install ipython_blocking

用法

在 Binder 中试用演示笔记本以查看ipython_blocking实际情况。最常见的使用方法ipython_blocking是使用%blockrun魔法并使用“cell -> run all”运行笔记本。 %blockrun button从初始的“cell -> run all”停止单元格执行消息,并将“cell -> run all below”处理程序附加到按钮,以便在用户填写后可以在没有回调函数的情况下以线性方式运行笔记本出其他 Widget 值。

### cell #1
import ipywidgets as widgets
import ipython_blocking # enables %block and %blockrun magic

text = widgets.Text()
dropdown = widgets.Dropdown(options=['', 'foo', 'bar', 'baz'])
button = widgets.Button(description='Run')
box = widgets.VBox(children=[text, dropdown, button])
box

### cell #2
%blockrun button

### cell #3 -- doesn't execute until the 'Run' button is pressed
### This gives the user a chance to interact with the Text and Dropdown widgets
print(text.value)
print(dropdown.value)

(下拉菜单未出现在此 .gif 中,因为它在 Windows 屏幕截图中被视为“单独的窗口”,抱歉!)

捕获执行

ipython_blocking“阻止”单元执行的方式是创建一个上下文管理器来更改IPython.shell.kernel['execute_request']处理程序的行为。当您在 Jupyter 笔记本中执行一个单元时,它会execute_request使用该代码向内核发送一条通信消息。

CaptureExecution管理器“阻塞”时,它将这些消息存储在一个列表中,而不是实际执行它们。当上下文管理器退出时,它将处理程序重置为其原始行为,然后重播存储的消息或丢弃它们。

import ipython_blocking
ctx = ipython_blocking.CaptureExecution(replay=True)
with ctx:
    while True:
        if break_function():
            break
        ctx.step() # handles all other messages that aren't 'execute_request' including widget value changes

%堵塞

魔法%block在导入时启用ipython_blocking。它接受一个函数或小部件对象并创建CaptureExecution要阻塞的管理器,直到该函数返回 True 或小部件值更改。

# cell 1
import ipywidgets as widgets
import ipython_blocking
dd = widgets.Dropdown(options=['', 'foo', 'bar', 'baz'])
dd

# cell 2
%block dd

# cell 3
# Won't actually be executed until the user chooses an option in the dd widget
print(dd.value)

%块运行

魔术%blockrun类似于,%block但它只接受一个ipywidgets.Button目标,并将“单元格 - > 在下面运行”处理程序附加到按钮。如果您希望 Notebook 的应用程序逻辑运行不止一次(和/或不想重新初始化小部件,因为用户可能只更改许多选项之一),那么%blockrun使用更好的魔法。

Button在 Notebook 首次呈现时使目标不可点击通常很方便,然后在其他小部件上添加处理程序,一旦发生某些输入验证.observe,就可以使其可点击。Button

# cell 1
import ipywidgets as widgets
import ipython_blocking
text = widgets.Text()
dd = widgets.Dropdown(options=['', 'foo', 'bar', 'baz'])
button = widgets.Button(description='Run', disabled=True)

def validation(ev):
    "make button clickable if user has put in more than 5 characters and chosen a dropdown option"
    if len(text.value) > 5 and dd.value:
        button.disabled = False
    else:
        button.disabled = True
text.observe(validation)
dd.observe(validation)

box = widgets.VBox(children=[text, dd, button])
box

# cell 2
%blockrun button

# cell 3
print(text.value)
print(dd.value)

备择方案

在用户与小部件交互后获取小部件值的其他方法是使用事件回调构造笔记本或异步编写代码。

我相信以线性和同步的方式编写Jupyter Notebook的应用程序逻辑有很大的好处,在 notebook 全局范围内包含尽可能多的变量。这些好处包括:

  • 更好地自省和理解工作流程(不会在代码中乱扔globalandprint语句)
  • 出错时更直接的调试
  • 更容易将代码分解成小块/单元

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

ipython_blocking-0.3.1.tar.gz (6.3 kB 查看哈希

已上传 source

内置分布

ipython_blocking-0.3.1-py3-none-any.whl (7.2 kB 查看哈希

已上传 py3