稳健 Dash 回调的一些技巧

稳健 Dash 回调的一些技巧

我创建了一个简单的 Dash 应用程序来演示一些我发现对构建复杂仪表板有用的设计模式。以下代码片段将创建如下所示的 dash 应用程序。

Full code example here: https://github.com/mack-raymond/dash-examples.git

管理组件 ID

Dash 组件需要一个唯一的 id 字符串才能使用回调函数注册。一个快速的方法是在创建组件时创建一个 ID——当布局中没有很多组件时这很好。如果布局很忙,更健壮的策略是使用 id 类来生成 id。使用类的好处是您可以确保 id 是唯一的,并且当您将 id 提供给组件时,您可以获得智能感知完成。下面是创建 ids 类的一种方法。

An ids class which subclasses an Enum.

使用 Enum 允许每个 id 有一个名称和一个值。在这种情况下,每个成员的值都设置为 auto(),这是一个自动递增的值。如果您不打算对 ALL、ALLSMALLER 和 MATCH 使用模式匹配回调,则可以使用 ids.switch1.name 访问像“switch1”这样的 id。否则,为了考虑模式匹配,我包含了一个 id 方法来生成可以匹配索引键的字典。请参阅上面代码段中的打印语句。

Intellisense in VScode

灵活的回调签名

dash 回调装饰器允许灵活地分配输出、输入和状态对象。当有许多这些对象和回调可以返回对输出的更新(或回调逻辑中的许多条件)的许多不同方式时,我发现将它们包装在字典中更简洁。而不是给回调函数位置参数,只需通过在回调函数中接受 **kwargs 来使用您在输入字典中编写的键。

Callback function with flexible Output, Input, State signatures and a default no_update class.

如果回调的输出是在字典中提供的,则回调中的返回更新需要是具有相同键的字典。如果回调有多种返回更新的方式,那么在每次返回之前定义字典可能会导致大量样板文件,特别是如果不是所有输出都需要更新。一种解决方案是构建一个类来表示默认的 no_update 并将更新传递给仅需要更新的键。在上面的代码片段中,我创建了一个更新数据类来表示更新。每次返回时,都会使用必要的更新实例化该类,然后使用 asdict 将其转换为字典。

回调上下文 (ctx)

在上面的回调中,我通过检查它是否与 callback_context (ctx)trigger_id 匹配来检查哪个组件 id 触发了回调,以确定要返回哪个更新。 ctx 在调试回调时是一个非常有用的对象。下面是 VScode 中变量资源管理器的图像,在回调到达我的断点后突出显示了 kwargs 和 ctx。

Debugging a callback in VScode

如果您发现这有帮助,请告诉我。如果您有任何其他提示,请随时分享。谢谢你。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/22842/51050909

posted @ 2022-09-09 09:51  哈哈哈来了啊啊啊  阅读(107)  评论(0编辑  收藏  举报