如何在Streamlit中为会话状态设置嵌套字典结构的值?
Streamlit嵌套字典session_state赋值方案
你当前的input_number函数只能将值存入扁平结构的st.session_state,但需要构建嵌套字典来实现分组汇总(如asset1小计、asset总计)。以下是具体的修改方案:
修改后的input_number函数
import streamlit as st def input_number(labelnya, session_path, value=None, help=None, format='%g'): valuenya = st.number_input(labelnya, value=value, help=help, format=format) valuenya = 0 if valuenya is None else valuenya # 解析嵌套路径,将"asset.asset1.cash_on_hand"拆分为键列表 keys = session_path.split('.') current_dict = st.session_state # 逐层创建嵌套字典(若不存在则初始化) for key in keys[:-1]: if key not in current_dict: current_dict[key] = {} current_dict = current_dict[key] # 给最终层级的键赋值 current_dict[keys[-1]] = valuenya print("All Session:\n{}".format(st.session_state)) return valuenya
函数调用示例
直接传入用.分隔的嵌套路径作为session_path参数,即可自动生成你需要的嵌套结构:
# 给asset.asset1.cash_on_hand赋值 input_number("Cash on Hand", session_path='asset.asset1.cash_on_hand', value=1) # 给asset.asset1.account_receivable赋值 input_number("Account Receivable", session_path='asset.asset1.account_receivable', value=2) # 给liabilities下的字段赋值 input_number("Short-term Loan", session_path='liabilities.liabilities1.short_term_loan', value=5)
执行后,st.session_state会生成目标嵌套结构:
{ "asset": { "asset1": { "cash_on_hand": 1, "account_receivable": 2 }, "asset2": {} }, "liabilities": { "liabilities1": { "short_term_loan": 5 }, "liabilities2": {} } }
分组汇总实现
基于嵌套结构可以轻松完成分组计算:
# 计算asset1的总计 asset1_total = sum(st.session_state['asset']['asset1'].values()) st.write(f"Asset1 Total: {asset1_total}") # 计算所有资产的总计 asset_total = sum(sum(group.values()) for group in st.session_state['asset'].values()) st.write(f"Total Assets: {asset_total}") # 计算所有负债的总计 liabilities_total = sum(sum(group.values()) for group in st.session_state['liabilities'].values()) st.write(f"Total Liabilities: {liabilities_total}")
内容的提问来源于stack exchange,提问作者Cignitor
相关产品推荐
相关产品推荐

