Streamlitでは、st.session_state.my_key = st.session_state.my_key というコードに意味がある
Streamlitのドキュメントを読んでたら、以下のコードが出てきた。
st.session_state.my_key = st.session_state.my_key
Widget behavior - Streamlit Docs
同じ変数に同じ変数を代入するっていうのに強烈な違和感を持った。 普通のプログラミングなら、まず無駄なコードってなるやつだ。 現に、Copilotにリファクタリングを指示したら消す提案をしてきた。
この挙動を実際に動かして確かめてみて、意味が理解できたのでメモしておく。
以下の例で確認。
import streamlit as st if "textbox_a" in st.session_state: st.session_state.textbox_a = st.session_state.textbox_a st.session_state.setdefault("show_textbox", True) if st.button("テキストボックス表示変更"): st.session_state.show_textbox = not st.session_state.show_textbox if st.session_state.show_textbox: st.text_input( "テキストボックスA", key="textbox_a", value="テキストボックスAの初期値", )
「テキストボックス表示変更」っていうボタンがあって、それを押すと、テキストボックスAの表示が切り替わる。
テキストボックスAでは、key="textbox_a" としているので、 st.session_state.textbox_a に入力した値を状態保持する。
ただし、Widgetは非表示になってしまうと状態はリセットされる。つまり、
st.session_state.textbox_a = st.session_state.textbox_a の部分のコードが無いとき
ボタンを押してテキストボックスを非表示にした時点で状態はリセットされ、テキストボックスAの値は「テキストボックスAの初期値」になってしまう。
コードがあるとき
ボタンを押してテキストボックスを非表示にして再度表示にした場合でも、前回入力した値が保持されている。