将元组返回到多个 dcc.Download 输出时出错
Error when returning a tuple to multiple dcc.Download Outputs
该示例是我的应用程序的显着简化版本。
该应用程序正常运行,但在启动时,它会抛出以下回溯。
我正在尝试 return 一个 dcc.Download
的元组到两个不同的输出。我试过解包元组并将每个元素也放在 return
中,但仍然出现相同的错误。
我不明白的是,当我实际上是 return 一个元组时,它是如何声明我 return 一个 None
类型的。
回溯:
dash._grouping.SchemaTypeValidationError: Schema: [<Output `rprt1.data`>, <Output `rprt2.data`>]
Path: ()
Expected type: (<class 'tuple'>, <class 'list'>)
Received value of type <class 'NoneType'>: None
功能代码:
import dash
from dash import html, Input, Output
from dash import dcc
import pandas as pd
app = dash.Dash(__name__)
app.layout = html.Div([
dcc.Download(id='rprt1'),
dcc.Download(id='rprt2'),
html.Button('A', id='button', n_clicks=0)
])
def multi_dnwld(df1, df2, names):
tup = (df1, df2)
dwnld = []
for df, name in zip(tup, names):
filename = name + ' - ' + '.csv'
dwnld.append(dcc.send_data_frame(df.to_csv, filename, index=False))
dwnld = tuple(dwnld)
return dwnld
df1 = pd.DataFrame([[1,2],[3,4]], columns = ['a', 'b'])
df2 = pd.DataFrame([[1,2],[3,4]], columns = ['a', 'b'])
@app.callback(
Output('rprt1', 'data'),
Output('rprt2', 'data'),
Input('button', 'n_clicks'),
prevent_initial_callback=True
)
def summary(n_clicks):
if n_clicks>0:
names = ['Sum1', 'Sum2']
return multi_dnwld(df1, df2, names)
if __name__ == '__main__':
app.run_server(debug=True)
当 n_clicks
等于 0 时会发生什么?
def summary(n_clicks):
if n_clicks>0:
names = ['Sum1', 'Sum2']
return multi_dnwld(df1, df2, names)
你的if
条件是False
,所以它不会进入那个区块。您在此函数中没有其他代码,因此 Dash 使用 Python 默认 return 值 None
。这可能只在应用程序加载时发生一次。只需添加一个 else
条件来处理这种情况就可以了。
该示例是我的应用程序的显着简化版本。
该应用程序正常运行,但在启动时,它会抛出以下回溯。
我正在尝试 return 一个 dcc.Download
的元组到两个不同的输出。我试过解包元组并将每个元素也放在 return
中,但仍然出现相同的错误。
我不明白的是,当我实际上是 return 一个元组时,它是如何声明我 return 一个 None
类型的。
回溯:
dash._grouping.SchemaTypeValidationError: Schema: [<Output `rprt1.data`>, <Output `rprt2.data`>]
Path: ()
Expected type: (<class 'tuple'>, <class 'list'>)
Received value of type <class 'NoneType'>: None
功能代码:
import dash
from dash import html, Input, Output
from dash import dcc
import pandas as pd
app = dash.Dash(__name__)
app.layout = html.Div([
dcc.Download(id='rprt1'),
dcc.Download(id='rprt2'),
html.Button('A', id='button', n_clicks=0)
])
def multi_dnwld(df1, df2, names):
tup = (df1, df2)
dwnld = []
for df, name in zip(tup, names):
filename = name + ' - ' + '.csv'
dwnld.append(dcc.send_data_frame(df.to_csv, filename, index=False))
dwnld = tuple(dwnld)
return dwnld
df1 = pd.DataFrame([[1,2],[3,4]], columns = ['a', 'b'])
df2 = pd.DataFrame([[1,2],[3,4]], columns = ['a', 'b'])
@app.callback(
Output('rprt1', 'data'),
Output('rprt2', 'data'),
Input('button', 'n_clicks'),
prevent_initial_callback=True
)
def summary(n_clicks):
if n_clicks>0:
names = ['Sum1', 'Sum2']
return multi_dnwld(df1, df2, names)
if __name__ == '__main__':
app.run_server(debug=True)
当 n_clicks
等于 0 时会发生什么?
def summary(n_clicks):
if n_clicks>0:
names = ['Sum1', 'Sum2']
return multi_dnwld(df1, df2, names)
你的if
条件是False
,所以它不会进入那个区块。您在此函数中没有其他代码,因此 Dash 使用 Python 默认 return 值 None
。这可能只在应用程序加载时发生一次。只需添加一个 else
条件来处理这种情况就可以了。