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の初期値」になってしまう。

コードがあるとき

ボタンを押してテキストボックスを非表示にして再度表示にした場合でも、前回入力した値が保持されている。