用于简化绘图应用程序构建的库
simpledash的Python项目详细描述
简单短划线
Simple Dash是一个库,它允许您直接将数据附加到布局并在后台创建所有必需的回调函数,从而简化了使用Plotly Dash构建应用程序的过程。在
安装
pip install simpledash
教程
最简单的例子-在布局中使用输入对象
让我们创建一个带有单个Input
组件的应用程序,它将呈现用户输入的任何内容。在
如您所见,没有显式定义回调,代码简洁明了。在
怎么了?setup_callbacks
方法扫描了应用程序的布局,找到了所有出现的dash.dependencies.Input
,并为它们创建了回调函数。在
更复杂的示例-带有data_provider
修饰符
的数据函数
我们希望有两个输入(命名为A和B),并让用户决定将使用哪一个 用于渲染输出值。此选择将通过下拉菜单完成。在
importdash_core_componentsasdccfromdash.dependenciesimportInputfromsimpledash.data.data_providersimportdata_providerinput_a=dcc.Input(id='data-input-a',value="")input_b=dcc.Input(id='data-input-b',value="")input_chooser=dcc.Dropdown(id='input-chooser',options=options_from(['A','B']))# use a `data_provider` annotation to indicate, that the method provides data based on inputs# inputs used by function are declared as arguments to the decorator# and are later on passed to the function as arguments@data_provider(Input('data-input-a','value'),Input('data-input-b','value'),Input('input-chooser','value'))defoutput_value(input_a_value,input_b_value,input_chooser_value):ifinput_chooser_value=="A":returninput_a_valueifinput_chooser_value=="B":returninput_b_valuereturn""app.layout=html.Div([html.Div(["A: ",input_a],className='row'),html.Div(["B: ",input_b],className='row'),html.Div(["Which one to show? ",input_chooser],className='row'),html.Br(),# you simply use `data_provider` instance in the layout (as in previous example)html.Div(["Here's the output: ",output_value],className='row',id='output'),# but you can also run some simple operations on `data_provider`, like `upper()`html.Div(["Also in uppercase!: ",output_value.upper()],className='row',id='output-upper')])setup_callbacks(app)
这次我们使用了data_provider
decorator来声明能够基于输入提供数据的函数。请注意,这是一个普通的python函数,因此您应该能够对输入执行任何操作,而不管其复杂性如何。在
我们在示例中看到的有趣的事情是output_value.upper()
。这只是个语法糖
这个简单的破折号让你不用再写一个data_provider
来写大写字母,
{{cd8>我们可以直接调用这个方法。在
请注意,您可以对data_provider
实例执行的操作集限于:
- 访问属性(
output_value.xyz
) - 按索引访问项(
output_value['xyz']
) - 调用方法(
output_value.xyz("param")
)
嵌套data_provider
s
假设您想复制前面示例中的output_value.upper()
行为,但是没有语法糖,即直接定义新的data_provider
。在
第一个选项是创建一个data_provider
,它接受与output_value
相同的输入,并将这些输入的值传递给output_value
。下面是它的样子:
@data_provider(Input('data-input-a','value'),Input('data-input-b','value'),Input('input-chooser','value'))defuppercase_output_value_1(input_a_value,input_b_value,input_chooser_value):v=output_value(input_a_value,input_b_value,input_chooser_value)returnv.upper()
第二个选项的样板文件要少得多,因为整个data_provider
被指定为输入:
@data_provider(output_value)defuppercase_output_value_2(v):returnv.upper()
下一步是什么?
要查看更高级的示例,请转到回购的examples部分。在
常见问题解答
是否存在没有输入的data_provider
的用法?
当您有一个静态值时,使用data_provider
不带输入,但是计算数据非常耗时。data_provider
将确保惰性,即只有当使用函数的组件显示给用户时,才会调用该函数。在
简单短划线和普通短划线的性能如何?
到目前为止,性能还不是最重要的,所以可以合理地预期简单的破折号要慢一些。也就是说,还有改进的余地(例如缓存data_provider
的输出),我们希望在以后的版本中解决这个问题。在
与普通破折号相比有哪些限制?
验证器喜欢在data_provider
s上失败,因此在许多情况下,您需要停止使用它们。在
举个例子-这行不通:
dcc.Graph(figure={'data':[graph_objects.Scattermapbox(lat=some_data_provider,...)]})
但这将:
dcc.Graph(figure={'data':[dict(lat=some_data_provider,...)]})
我能测试一下吗?
当然。任何适用于普通仪表板应用程序的测试方法也将适用于这种方法。在
测试数据提供程序也很容易——它们的行为就像一个方法,所以可以在测试代码中调用它们。在
- 项目
标签: