You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+Streamlit开发:函数返回值与st.session_state传参选型

Python/Streamlit中DataFrame转换后的变量传递:返回值 vs st.session_state?

问题描述

我正在学习Python和Streamlit框架,现在碰到了代码设计的问题:当我用函数对pandas DataFrame做转换时,有两种变量传递方式可选——要么通过函数返回值把结果传给其他函数或展示给用户,要么在函数里把结果赋值给st.session_state字典,让它能像全局变量一样在代码各处访问。想请教哪种更符合Python风格,或是Streamlit官方推荐的方式?

示例代码1:使用返回值

def some_function(dataframe):
    a = dataframe.transform(...)  # 数据转换操作
    return a

st.dataframe(some_function(raw_dataframe))

示例代码2:直接修改st.session_state

def some_function(dataframe):
    a = dataframe.transform(...)  # 数据转换操作
    st.session_state['a'] = a

回答

从Python通用编程风格来看

  • 优先选择返回值的方式(示例1),这是Python函数设计的核心原则:函数应该承担单一职责,只负责数据转换并返回结果,不依赖或修改外部状态。这种纯函数的优势很明显:
    • 可复用性强:不需要任何修改就能在非Streamlit的Python脚本、测试用例中调用;
    • 可测试性高:只需传入输入数据,就能验证输出是否符合预期,无需处理session_state的干扰;
    • 逻辑清晰:函数的输入输出一目了然,后续维护时能快速理解代码作用。
  • 示例2的方式属于有副作用的函数,它不仅完成了数据转换,还修改了外部的st.session_state,会让代码逻辑的追踪难度上升——当项目规模变大后,你很难快速定位到哪个函数修改了session_state中的某个值,调试和维护成本都会增加。

从Streamlit的场景需求来看

st.session_state的设计初衷是解决跨组件、跨会话的状态共享问题,所以只有当你需要满足以下场景时,才适合使用它:

  • 需要在多个独立的Streamlit组件(比如按钮回调、侧边栏选择器、不同页面)之间共享转换后的DataFrame;
  • 希望用户刷新页面后,之前转换的数据状态不会丢失;
  • 需要基于用户的交互操作(比如筛选、排序)动态更新数据,并保留这些操作后的状态。

即使在这些场景下,也建议把数据转换和状态修改的逻辑分离:先写一个纯转换函数(类似示例1),再在调用它的地方将结果赋值给st.session_state,示例如下:

def transform_dataframe(df):
    # 仅负责数据转换,无任何外部依赖
    transformed_df = df.dropna().sort_values('date')
    return transformed_df

# 在需要的位置调用并保存状态
if 'processed_data' not in st.session_state:
    st.session_state['processed_data'] = transform_dataframe(raw_df)

# 后续可在任意位置使用
st.dataframe(st.session_state['processed_data'])

总结

  • 日常的单一数据转换逻辑,优先使用返回值的方式,符合Python的函数设计规范,代码更健壮、易维护;
  • 只有当需要跨组件/跨会话共享状态时,才使用st.session_state,并且尽量保持转换函数的纯粹性,将状态修改的逻辑放在函数外部。

内容的提问来源于stack exchange,提问作者Marcel Felipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:45:13